Elasticsearch - 模糊,短语,完成建议和破折号

时间:2016-05-19 15:02:55

标签: elasticsearch fuzzy-search search-suggestion phrase

所以我一直在尝试单独的问题试图实现我想要实现的搜索功能,但仍然不尽如人意地想我会问人们他们建议的最佳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
                }
            }
        }
    }
}

0 个答案:

没有答案