实际上,这不是内部执行查询的方式。 Term 和 Match 查询在一些方面有所不同,但要记住的最重要的一点是,Term 查询会在倒排索引中准确搜索指定的查询文本,而 Match 查询使用 any 分析器分析查询文本使用的字段,然后使用这些值来搜索倒排索引。
让我们看一个例子,使用英语词干分析器。
我制作了一个名为 my_analyzer (like in the docs) 的英语词干过滤器:
PUT
{
"settings": {
"analysis": {
"analyzer": {
"my_analyzer": {
"type":"custom",
"tokenizer": "whitespace",
"filter": [
"my_stemmer"
]
}
},
"filter": {
"my_stemmer": {
"type": "stemmer",
"name": "english"
}
}
}
}
}
接下来我为我的词干分析器定义一个映射,只需一个名为 value 的简单字段即可:
PUT _mapping/test
{
"properties": {
"value": {
"type": "string",
"analyzer": "my_analyzer"
}
}
}
现在,让我们索引两个文档,
PUT{"value":"proportion"}
PUT{"value":"proportions"}
当我们执行以下查询时,您认为会发生什么?仅供参考,您可以将此处的“比例”更改为“比例”以获得相同的结果。
"query": {
"bool": {
"should": [{
"term": {"value": {"value": "proportion"}}
}]
}
}
"hits": {
"total": 0,
"max_score": null,
"hits": []
}
没有结果。这很重要,因为我们直接在倒排索引中搜索“比例”,结果为空。这实际上是因为“比例”或“比例”这两个词不在我们的倒排索引中。里面有什么?让我们来了解一下:
"tokens": [
{
"token": "proport",
"start_offset": 0,
"end_offset": 11,
"type": "word",
"position": 1
}
]
只有单词proport 在索引中。如果您修改上面的布尔查询以使用文本proport,那么您将获得两个文档。当您像这样使用匹配查询时:
"query": {
"match": {
"value": "proportions"
}
}
您实际上是通过词干分析器运行“比例”,匹配查询在倒排索引中搜索“比例”,得到以下结果:
"hits": [
{
"_index": "test",
"_type": "test",
"_id": "1",
"_score": 0.30685282,
"_source": {
"value": "proportion"
}
},
{
"_index": "test",
"_type": "test",
"_id": "2",
"_score": 0.30685282,
"_source": {
"value": "proportion"
}
}
]
TLDR:词条查询在倒排索引中准确查找您提供的内容,而匹配查询在倒排索引中查找已分析的输出