给定以下查询:
match: {"title": "proportions"}对于使用词干分析器分析标题字段的文档:
Doc 1 title: proportion
Doc 2 title: proportions会送回两份文件。
在内部执行查询的方式如下:
"bool":{
"should": [{"term" : {"title" : "proportions}}]
}如果是的话,“比例”这个词根的匹配是在哪里进行的?我在努力弄清楚在管道中的词根匹配在哪里。
发布于 2015-08-19 20:36:21
实际上,查询不是这样在内部执行的。Term和Match查询有几个不同之处,但最重要的一点是,术语查询搜索倒排索引,准确地查找指定的查询文本,而Match查询使用所使用的任何分析器分析查询文本,然后使用这些值搜索倒排索引。
让我们来看看一个例子,使用英语词干器。
我制作了一个名为my_analyzer (就像在医生里)的英语词干过滤器:
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"}当我们执行以下查询时,您认为会发生什么?FYI,您可以在这里将“比例”更改为“比例”,以获得相同的结果。
"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。如果您修改上面的bool查询以使用文本proport,那么您将得到两个文档。当您像这样使用匹配查询时:
"query": {
"match": {
"value": "proportions"
}
}实际上,通过词干分析器运行“比例”,匹配查询在倒排索引中搜索"proport",得到以下结果:
"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:术语查询准确地查找倒排索引中给它的内容,匹配查询在倒排索引中查找分析的输出。
https://stackoverflow.com/questions/32103886
复制相似问题