匹配查询 | Elasticsearch: 权威指南 | Elastic
2024-11-14
匹配查询 match
是个 核心 查询。无论需要查询什么字段, match
查询都应该会是首选的查询方式。
它是一个高级 全文查询 ,这表示它既能处理全文字段,又能处理精确字段。
这就是说, match
查询主要的应用场景就是进行全文搜索,我们以下面一个简单例子来说明全文搜索是如何工作的:
首先,我们使用 bulk
API 创建一些新的文档和索引:
DELETE /my_index PUT /my_index { "settings": { "number_of_shards": 1 }} POST /my_index/my_type/_bulk { "index": { "_id": 1 }} { "title": "The quick brown fox" } { "index": { "_id": 2 }} { "title": "The quick brown fox jumps over the lazy dog" } { "index": { "_id": 3 }} { "title": "The quick brown fox jumps over the quick dog" } { "index": { "_id": 4 }} { "title": "Brown fox brown dog" }
删除已有的索引。 | |
稍后,我们会在 被破坏的相关性! 中解释只为这个索引分配一个主分片的原因。 |
我们用第一个示例来解释使用 match
查询搜索全文字段中的单个词:
GET /my_index/my_type/_search { "query": { "match": { "title": "QUICK!" } } }
Elasticsearch 执行上面这个 match
查询的步骤是:
检查字段类型 。
标题 title
字段是一个 string
类型( analyzed
)已分析的全文字段,这意味着查询字符串本身也应该被分析。
分析查询字符串 。
将查询的字符串 QUICK!
传入标准分析器中,输出的结果是单个项 quick
。因为只有一个单词项,所以 match
查询执行的是单个底层 term
查询。
查找匹配文档 。
用 term
查询在倒排索引中查找 quick
然后获取一组包含该项的文档,本例的结果是文档:1、2 和 3 。
为每个文档评分 。
用 term
查询计算每个文档相关度评分 _score
,这是种将
词频(term frequency,即词 quick
在相关文档的 title
字段中出现的频率)和反向文档频率(inverse document frequency,即词 quick
在所有文档的 title
字段中出现的频率),以及字段的长度(即字段越短相关度越高)相结合的计算方式。参见 相关性的介绍 。
这个过程给我们以下(经缩减)结果:
"hits": [ { "_id": "1", "_score": 0.5, "_source": { "title": "The quick brown fox" } }, { "_id": "3", "_score": 0.44194174, "_source": { "title": "The quick brown fox jumps over the quick dog" } }, { "_id": "2", "_score": 0.3125, "_source": { "title": "The quick brown fox jumps over the lazy dog" } } ]
官方地址:https://www.elastic.co/guide/cn/elasticsearch/guide/current/match-query.html