因此,我一直在问单独的问题,试图实现我想要实现的搜索功能,但仍然达不到要求,所以我想我只会问人们他们对最佳 Elasticsearch 设置、映射、索引和查询结构的建议,以完成我正在寻找的工作为了。
当您键入查询类别的解决方案时,我需要进行搜索。如果我输入“mex”,我希望得到“墨西哥餐厅”、“墨西哥杂货店”、“德克萨斯墨西哥餐厅”和“医疗用品”等结果。 “医疗用品”会回来,因为模糊可能会认为你想输入“med”。不过,其中包含“墨西哥”的类别应该首先列出。关于优先级主题,如果用户输入“bar”,我希望“Bar”出现在列表中的“Barn”或“Barbecue”之前。
除此之外,我还在寻找用户搜索“墨西哥商店”的能力,并且仍然会返回“墨西哥杂货店”。此外,如果用户输入“墨西哥商店”,仍会返回“墨西哥杂货店”。
除了上述功能之外,我还需要一种处理破折号的方法。如果用户输入“tex mex”、“tex-mex”、“texmex”的任何变体,我希望得到“Tex-Mex Restaurant”。
如果您已经读到这里,我真的很感激。我已经实施了一些解决方案,但没有一个能够满足我上面描述的所有需求。
我当前的配置:
settings
curl -XPUT http://localhost:9200/objects -d '{
"settings": {
"analysis": {
"analyzer": {
"lower": {
"type": "custom",
"tokenizer": "keyword",
"filter": [ "lowercase" ]
}
}
}
}
}'
mapping
curl -XPUT http://localhost:9200/objects/object/_mapping -d '{
"object" : {
"properties" : {
"objectDescription" : {
"type" : "string",
"fields" : {
"lower": {
"type": "string",
"analyzer": "lower"
}
}
},
"suggest" : {
"type" : "completion",
"analyzer" : "simple",
"search_analyzer" : "simple",
"payloads" : true
}
}
}
}'
index
{
"id":6663521500659712,
"objectDescription":"Mexican Grocery Store",
"suggest":{
"input":["Mexican Grocery Store"],
"output":"Mexican Grocery Store",
"payload":{
"id":6663521500659712
}
}
}
query
{
"query":{
"bool":{
"should":[
{
"fuzzy":{
"objectDescription.lower":{"value":"med"}
}
},
{
"term":{
"objectDescription":{"value":"med"}
}
}
]
}
},
"from":0,
"size":20,
"suggest":{
"object-suggest":{
"text":"med",
"completion":{
"field":"suggest",
"fuzzy":{
"fuzzy":true
}
}
}
}
}