在这里阅读了official documentation和一些Q& A后,我仍然无法让我的Elasticsearch正确搜索没有通配符的部分单词。
我有大约470,000个公司的条目,并希望在开始输入公司名称时完成某种自动完成。
索引的创建方式如下:
{
"lei-index" : {
"aliases" : { },
"mappings" : {
"record" : {
"properties" : {
"LegalName" : {
"type" : "text",
"analyzer" : "legalname_analyzer",
"search_analyzer" : "legalname_search"
}
}
}
},
"settings" : {
"index" : {
"number_of_shards" : "5",
"provided_name" : "lei-index",
"creation_date" : "1478597987141",
"analysis" : {
"filter" : {
"legalname_filter" : {
"type" : "edge_ngram",
"min_gram" : "4",
"max_gram" : "20"
}
},
"analyzer" : {
"legalname_analyzer" : {
"filter" : [
"legalname_filter",
"lowercase"
],
"type" : "custom",
"tokenizer" : "legalname_tokenizer"
},
"legalname_search" : {
"filter" : [
"legalname_filter",
"standard",
"lowercase"
],
"type" : "custom",
"tokenizer" : "legalname_tokenizer"
}
},
"tokenizer" : {
"legalname_tokenizer" : {
"token_chars" : [
"letter"
],
"min_gram" : "4",
"type" : "edge_ngram",
"max_gram" : "20"
}
}
},
"number_of_replicas" : "1",
"uuid" : "mUBvjn9BSBayrkvXSIXxQw",
"version" : {
"created" : "5000051"
}
}
}
}
}
当我知道寻找让我们说Hapag-Loyd时,我可以搜索" Hapag"得到3个结果" hapag loyd"," hapag-loyd"和" hapag loyd"
但我想存档我可以搜索" hapa"并且已经得到了结果。
http://localhost:9200/lei-index/record/_search?pretty&q=hapa
0结果
使用通配符我得到结果,包括hapag loyd,但我猜通配符在较大的索引中效率不高
http://localhost:9200/lei-index/record/_search?pretty&q=hapa *
我尝试使用关键字作为标记符并将过滤器保留在外,只使用标记生成器,但没有得到预期的结果。
测试分析仪:
curl -XPOST 'localhost:9200/lei-index/_analyze?pretty' -d '{ "analyzer": "legalname_analyzer", "text": "hapag"}'
{
"tokens" : [
{
"token" : "hapa",
"start_offset" : 0,
"end_offset" : 4,
"type" : "word",
"position" : 0
},
{
"token" : "hapa",
"start_offset" : 0,
"end_offset" : 5,
"type" : "word",
"position" : 1
},
{
"token" : "hapag",
"start_offset" : 0,
"end_offset" : 5,
"type" : "word",
"position" : 1
}
]
}
如果有人能指出我的思路在哪里出错,那将会很棒,因为这是我第一次使用elasticsearch。
最后一件事,我与hapag-loyd无关,我只是在这里用它作为例子。
由于
答案 0 :(得分:1)
在发出以下请求时,query_string
查询的标准分析器会启动。
http://localhost:9200/lei-index/record/_search?pretty&q=hapa
那不是你想要的。相反,您需要指定LegalName
字段,以便利用该字段的search_analyzer
:
http://localhost:9200/lei-index/record/_search?pretty&q=LegalName:hapa
另一种解决方案是保留您的查询,但使用您自己的查询字符串覆盖查询字符串的标准分析器:
http://localhost:9200/lei-index/record/_search?pretty&q=hapa&analyzer=legalname_search