≫ 全文匹配
MATCH 子句允许对文本字段进行全文搜索。输入的查询字符串会使用与索引时应用于文本的相同设置进行 分词。除了对输入文本进行分词外,查询字符串还支持多种 全文运算符,用于约束关键词应如何构成有效匹配。对于没有显式布尔运算符的多关键词查询,SQL 和 HTTP JSON 的默认行为不同:SQL 遵循 boolean_mode,其默认值为 and,除非按表或按查询覆盖;而 JSON match 查询的默认值为 or,除非你显式设置 "operator"。
全文匹配子句可以与属性 过滤器 结合使用,作为 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 表 部分。
MATCH('search query' [, table_name])
'search query':全文搜索查询字符串,可以包含各种 全文操作符。table_name:(可选)应用于全文搜索的表的名称,在 JOIN 查询中指定不同于默认左表的表。
SELECT 语句使用 MATCH 子句进行全文搜索,该子句必须位于 WHERE 之后。MATCH() 接受一个输入字符串,在该字符串中可用所有 全文操作符。
关于 SQL 特定的默认关键词组合行为,请参见 boolean_mode。
- SQL
- JSON
- MATCH with filters
SELECT * FROM myindex WHERE MATCH('"find me fast"/2');+------+------+----------------+
| id | gid | title |
+------+------+----------------+
| 1 | 11 | first find me |
| 2 | 12 | second find me |
+------+------+----------------+
2 rows in set (0.00 sec)全文匹配在 /search 端点和基于 HTTP 的客户端中可用。以下子句可用于执行全文匹配:
"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" 是一个查询,匹配整个短语。它类似于 SQL 中的短语操作符。以下是一个示例:
"query":
{
"match_phrase": { "_all" : "had grown quite" }
}
"query_string" 接受一个输入字符串作为 MATCH() 语法的全文查询。
"query":
{
"query_string": "Church NOTNEAR/3 street"
}
"match_all" 接受一个空对象并返回表中的文档,而不进行任何属性过滤或全文匹配。或者,您也可以在请求中省略 query 子句,其效果相同。
"query":
{
"match_all": {}
}
所有全文匹配子句都可以与 must、must_not 和 should 操作符结合使用,这些操作符属于 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
}'{
"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"
}
}