所以我一直在尝试单独的问题试图实现我想要实现的搜索功能,但仍然不尽如人意地想我会问人们他们建议的最佳Elasticsearch设置,映射,索引和查询结构做什么我在找。
当您键入查询类别的解决方案时,我需要搜索。如果我输入" mex"我希望得到像"墨西哥餐厅","墨西哥杂货店"," Tex-Mex餐厅"和"医疗用品"。 "医疗用品"会回来因为模糊可能会认为你想输入" med"。与"墨西哥"的类别在它应该首先列出。关于用户输入" bar"的优先级主题我希望" Bar"在" Barn"之前的列表中或"烧烤"。
除此之外,我还在寻找用户搜索"墨西哥商店"和"墨西哥杂货店"仍然会被退回。此外,如果用户输入" Store Mexican"为"墨西哥杂货店"仍然被退回。
除上述功能外,我还需要一种方法来处理破折号。如果用户要输入" tex mex"," tex-mex"," texmex"的任何变体。我希望得到" Tex-Mex餐厅"。
如果你已经读过这篇文章,我真的很感激。我已经实现了一些解决方案,但是没有一个能够解决我上面描述的所有问题。
我目前的配置:
设置
curl -XPUT http://localhost:9200/objects -d '{
"settings": {
"analysis": {
"analyzer": {
"lower": {
"type": "custom",
"tokenizer": "keyword",
"filter": [ "lowercase" ]
}
}
}
}
}'
映射
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
}
}
}
}'
索引
{
"id":6663521500659712,
"objectDescription":"Mexican Grocery Store",
"suggest":{
"input":["Mexican Grocery Store"],
"output":"Mexican Grocery Store",
"payload":{
"id":6663521500659712
}
}
}
查询
{
"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
}
}
}
}
}