Elasticsearch - Fuzzy, phrase, completion suggestor and dashes

戏子无情 提交于 2019-12-10 20:37:25

问题


So I have been asking separate questions trying to achieve the search functionality I would like to achieve but still falling short so thought I would just ask people what they suggest for the optimal Elasticsearch settings, mappings, indexing and query structure to do what I am looking for.

I need a search as you type solution that queries categories. If I typed in "mex" I am looking to get back results like "Mexican Restaurant", "Mexican Grocery Store", "Tex-Mex Restaurant" and "Medical Supplies". The "Medical Supplies" would come back because the fuzzy could think you wanted to type "med". The categories with "Mexican" in it should be listed first though. On the topic of priority if a user typed in "bar" I would expect "Bar" to be in the list before "Barn" or "Barbecue".

On top of this I am also looking for the ability for a user to search "Mexican Store" and "Mexican Grocery Store" would still be returned. Also if a user typed in "Store Mexican" for "Mexican Grocery Store" to still be returned.

As well as the above features I need a way to handle dashes. If a user were to type any variation of "tex mex", "tex-mex", "texmex" I would expect to get "Tex-Mex Restaurant".

If you have read this far I really appreciate it. I have implemented a few solutions already but none of them have been able to to all of what I need described above.

My current configuration:

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
                }
            }
        }
    }
}

来源:https://stackoverflow.com/questions/37327161/elasticsearch-fuzzy-phrase-completion-suggestor-and-dashes

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!