≫ 全文匹配

匹配

MATCH 子句允许在文本字段中进行全文搜索。输入查询字符串使用与索引文本时相同的设置进行分词。除了输入文本的分词外,查询字符串还支持一系列的 全文操作符,这些操作符会强制执行各种规则,以确保关键词能够提供有效的匹配。

全文匹配子句可以与属性 过滤器 结合使用,作为 AND 布尔运算。全文匹配和属性过滤器之间的 OR 关系不被支持

匹配查询总是首先在过滤过程中执行,然后是 属性过滤器。属性过滤器应用于匹配查询的结果集。没有匹配子句的查询称为全扫描。

SELECT 子句中最多只能有一个 MATCH()

使用 全文查询语法,匹配将在文档的所有索引文本字段中进行,除非表达式要求在字段内进行匹配(如短语搜索)或受到字段操作符的限制。

在使用 JOIN 查询时,MATCH() 可以接受一个可选的第二个参数,指定全文搜索应应用于哪个表。默认情况下,全文查询应用于 JOIN 操作中的左表:

SELECT * FROM table1 LEFT JOIN table2 ON table1.id = table2.id WHERE MATCH('search query', table2);

这允许你在 JOIN 操作中对特定表进行全文搜索。有关使用 MATCH 与 JOIN 的详细信息,请参阅 JOIN 表 部分。

SQL

MATCH('search query' [, table_name])
  • 'search query':全文搜索查询字符串,可以包含各种 全文操作符
  • table_name:(可选)应用于全文搜索的表的名称,在 JOIN 查询中指定不同于默认左表的表。

SELECT 语句使用 MATCH 子句进行全文搜索,该子句必须位于 WHERE 之后。MATCH() 接受一个输入字符串,在该字符串中可用所有 全文操作符

‹›
  • SQL
  • MATCH with filters
📋
SELECT * FROM myindex WHERE MATCH('"find me fast"/2');
‹›
Response
+------+------+----------------+
| id   | gid  | title          |
+------+------+----------------+
|    1 |   11 | first find me  |
|    2 |   12 | second find me |
+------+------+----------------+
2 rows in set (0.00 sec)

HTTP JSON

全文匹配在 /search 端点和基于 HTTP 的客户端中可用。以下子句可用于执行全文匹配:

match

"match" 是一个简单的查询,匹配指定字段中的指定关键词。

"query":
{
  "match": { "field": "keyword" }
}

您可以指定一个字段列表:

"match":
{
  "field1,field2": "keyword"
}

或者可以使用 _all* 来搜索所有字段。

可以使用 "!field" 搜索所有字段,但不包括一个字段:

"match":
{
  "!field1": "keyword"
}

默认情况下,关键词使用 OR 操作符组合。但是,可以使用 "operator" 子句更改此行为:

"query":
{
  "match":
  {
    "content,title":
    {
      "query":"keyword",
      "operator":"or"
    }
  }
}

"operator" 可以设置为 "or" 或 "and"。

boost 修饰符也可以应用。它会将词 IDF 分数在包含 IDF 的排名分数中提高指定的倍数。它不会以任何方式影响匹配过程。

"query":
{
  "match":
  {
    "field1":
    {
      "query": "keyword",
      "boost": 2.0
    }
  }
}

match_phrase

"match_phrase" 是一个查询,匹配整个短语。它类似于 SQL 中的短语操作符。以下是一个示例:

"query":
{
  "match_phrase": { "_all" : "had grown quite" }
}

query_string

"query_string" 接受一个输入字符串作为 MATCH() 语法的全文查询。

"query":
{
  "query_string": "Church NOTNEAR/3 street"
}

match_all

"match_all" 接受一个空对象并返回表中的文档,而不进行任何属性过滤或全文匹配。或者,您也可以在请求中省略 query 子句,其效果相同。

"query":
{
  "match_all": {}
}

结合全文过滤与其他过滤器

所有全文匹配子句都可以与 mustmust_notshould 操作符结合使用,这些操作符属于 JSON bool 查询

‹›
  • match
  • match_phrase
  • query_string
  • PHP
  • Python
  • Python-asyncio
  • javascript
  • Java
  • C#
  • Rust
  • TypeScript
  • Go
📋
POST /search
-d
'{
    "table" : "hn_small",
    "query":
    {
        "match":
        {
            "*" : "find joe"
        }
    },
    "_source": ["story_author","comment_author"],
    "limit": 1
}'
‹›
Response
{
   "took" : 3,
   "timed_out" : false,
   "hits" : {
      "hits" : [
         {
            "_id": 668018,
            "_score" : 3579,
            "_source" : {
               "story_author" : "IgorPartola",
               "comment_author" : "joe_the_user"
            }
         }
      ],
      "total" : 88063,
      "total_relation" : "eq"
   }
}
Last modified: August 28, 2025