≫ 全文匹配

MATCH

MATCH 子句允许在文本字段中进行全文搜索。输入的查询字符串会使用与索引时应用于文本的相同设置进行分词。除了对输入文本的分词外,查询字符串还支持多种全文操作符,这些操作符对关键词如何提供有效匹配施加各种规则。

全文匹配子句可以与属性过滤器以 AND 布尔关系组合。不支持全文匹配与属性过滤器之间的 OR 关系

匹配查询总是在过滤过程的第一步执行,随后是属性过滤器。属性过滤器应用于匹配查询的结果集。没有匹配子句的查询称为全表扫描。

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

使用全文查询语法时,匹配会在文档的所有已索引文本字段中执行,除非表达式要求在某个字段内匹配(如短语搜索)或被字段操作符限制。

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

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

这允许你在连接操作中对特定表执行全文搜索。有关使用 MATCH 与 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": {}
}

将全文过滤与其他过滤器结合使用

所有全文匹配子句都可以与必须必须不应该操作符结合使用,构成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