我们正在使用弹性搜索来实现搜索公司列表,但它不是我们所期望的
**Example companies:**
Infosys technologies
Infosys technologies ltd
Infosys technologies pvt ltd
Infosys technologies Limited
Infosys technologies Private Limited
BAC Infosys ltd
情景:
搜索关键字“Infosys”时,应返回“Infosys” 技术“列表。
在搜索关键字“Infosys ltd”时,应返回“Infosys” 技术“列表。
在搜索关键字“BAC Infosys ltd”时,应返回“BAC” Infosys ltd“list。
使用以下设置和映射
{
"settings": {
"analysis": {
"filter": {
"nGram_filter": {
"type": "nGram",
"min_gram": 3,
"max_gram": 3,
"token_chars": [
"letter",
"digit",
"punctuation",
"symbol"
]
}
},
"analyzer": {
"nGram_analyzer": {
"type": "custom",
"tokenizer": "keyword",
"filter": [
"lowercase",
"asciifolding",
"nGram_filter"
]
},
"keyword_analyzer": {
"type": "custom",
"tokenizer": "keyword",
"filter": [
"lowercase",
"asciifolding"
]
}
}
}
},
"mappings": {
"companies": {
"properties": {
"company_name": {
"type": "string",
"store": "true",
"index_analyzer": "nGram_analyzer",
"search_analyzer": "keyword_analyzer",
"null_value": "null"
}
}
}
}
}
查询:
{"query":
{
"bool": {
"must": [
{ "match": { "company_name": "Infosys technologies" }}
],
"minimum_should_match": "80%"
}
}
}
请帮我解决这个问题。
答案 0 :(得分:0)
你在搜索查询和映射方面都缺少一些东西。在你的场景中查看并使用你当前的映射设置 1)结果也将具有BAC值。你应该切换到边缘n-gram。但这不允许你从中间搜索。 2)它还取决于您正在构建的搜索类型,您可以避免我在1中建议的安排。对于您的所有场景,我们假设您的列表也可以在场景的结果中具有BAC值,但在列表中排名较低。为此,您可以使用带模糊的proximity queries查询进行拼写检查。
以上三种情况无法向我解释整个功能并使用-cases作为搜索功能,但我认为弹性提供的邻近搜索可以让您更灵活地满足您的情况。
答案 1 :(得分:0)
带状疱疹可以帮助: https://www.elastic.co/guide/en/elasticsearch/guide/current/shingles.html
对于您的情况,shingle filter
分析器不相关,它应该影响性能和相关性得分。使用custom analyzer
和standard tokenizer
创建lowercase filter
和{{1}}。
HTH,