使用 edge_ngram 进行搜索的 Elastic returns 意外结果
Elastic returns unexpected result from Search using edge_ngram
我正在研究如何将我的数据存储在 elasticsearch 中。首先,我尝试了模糊功能,虽然它工作正常,但我没有收到预期的结果。之后,我尝试了 ngram
,然后是 edge_ngram
分词器。 edge_ngram
分词器看起来像一个自动完成功能。正是我所需要的。但它仍然给出了意想不到的结果。我配置 min 1
和 max 5
以获取所有以我搜索的第一个字母开头的结果。虽然这有效,但我仍然会在继续输入时得到这些结果。
示例:我有一个名称字段,其中填充了名为 The New York Times
和 The Guardian
的文档。现在,当我搜索 T
时,两者都按预期发生。但当我搜索 TT
、TTT
等时,也会发生同样的情况。
在这种情况下,无论我是在 Kibana 中还是从我的应用程序(在所有字段上使用 MultiMatch
)执行搜索都没有关系。 Kibana 甚至向我展示了它与单个字母 T 匹配。
那么我错过了什么?我怎样才能像使用自动完成一样获得结果但又不会有太多结果?
定义索引映射时,需要指定 search_analyzer
作为标准。如果没有显式定义 search_analyzer
,则默认情况下 elasticsearch 认为 search_analyzer
与指定的 analyzer
相同。
添加包含索引数据、映射、搜索查询和搜索结果的工作示例
索引映射:
{
"settings": {
"analysis": {
"analyzer": {
"autocomplete": {
"tokenizer": "autocomplete",
"filter": [
"lowercase"
]
}
},
"tokenizer": {
"autocomplete": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 5,
"token_chars": [
"letter"
]
}
}
}
},
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer": "autocomplete",
"search_analyzer": "standard" // note this
}
}
}
}
索引数据:
{
"name":"The Guardian"
}
{
"name":"The New York Times"
}
搜索查询:
{
"query": {
"match": {
"name": "T"
}
}
}
搜索结果:
"hits": [
{
"_index": "69027911",
"_type": "_doc",
"_id": "1",
"_score": 0.23092544,
"_source": {
"name": "The New York Times"
}
},
{
"_index": "69027911",
"_type": "_doc",
"_id": "2",
"_score": 0.20824991,
"_source": {
"name": "The Guardian"
}
}
]
我正在研究如何将我的数据存储在 elasticsearch 中。首先,我尝试了模糊功能,虽然它工作正常,但我没有收到预期的结果。之后,我尝试了 ngram
,然后是 edge_ngram
分词器。 edge_ngram
分词器看起来像一个自动完成功能。正是我所需要的。但它仍然给出了意想不到的结果。我配置 min 1
和 max 5
以获取所有以我搜索的第一个字母开头的结果。虽然这有效,但我仍然会在继续输入时得到这些结果。
示例:我有一个名称字段,其中填充了名为 The New York Times
和 The Guardian
的文档。现在,当我搜索 T
时,两者都按预期发生。但当我搜索 TT
、TTT
等时,也会发生同样的情况。
在这种情况下,无论我是在 Kibana 中还是从我的应用程序(在所有字段上使用 MultiMatch
)执行搜索都没有关系。 Kibana 甚至向我展示了它与单个字母 T 匹配。
那么我错过了什么?我怎样才能像使用自动完成一样获得结果但又不会有太多结果?
定义索引映射时,需要指定 search_analyzer
作为标准。如果没有显式定义 search_analyzer
,则默认情况下 elasticsearch 认为 search_analyzer
与指定的 analyzer
相同。
添加包含索引数据、映射、搜索查询和搜索结果的工作示例
索引映射:
{
"settings": {
"analysis": {
"analyzer": {
"autocomplete": {
"tokenizer": "autocomplete",
"filter": [
"lowercase"
]
}
},
"tokenizer": {
"autocomplete": {
"type": "edge_ngram",
"min_gram": 1,
"max_gram": 5,
"token_chars": [
"letter"
]
}
}
}
},
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer": "autocomplete",
"search_analyzer": "standard" // note this
}
}
}
}
索引数据:
{
"name":"The Guardian"
}
{
"name":"The New York Times"
}
搜索查询:
{
"query": {
"match": {
"name": "T"
}
}
}
搜索结果:
"hits": [
{
"_index": "69027911",
"_type": "_doc",
"_id": "1",
"_score": 0.23092544,
"_source": {
"name": "The New York Times"
}
},
{
"_index": "69027911",
"_type": "_doc",
"_id": "2",
"_score": 0.20824991,
"_source": {
"name": "The Guardian"
}
}
]