Elasticsearch高级自动完成

时间:2018-08-31 08:12:39

标签: elasticsearch autocomplete lucene autosuggest

我想用Elasticsearch自动完成用户输入。现在有大量的教程,但是没有涉及到非常详细的内容。

我的查询遇到的最后一个问题是,它应将不是真正的“自动完成”结果的得分降低。例: 是:

我输入:“床”

我发现:“床”,“大床”,“花式床”,“床架”

想要:

我输入:“床”

我发现:“床”,“床架”,[其他“床XXX”结果],“花式床”,“大床”

因此,我希望Elasticsearch首先完成“在右侧”(如果可行)。然后使用前面带有单词的结果。 我已经尝试过完成建议程序,但我没有做其他我想做的事情,但是也遇到了同样的问题。

在德语中有很多单词示例,例如Bigbed(我知道这不是英语中的真实单词。但是我不希望这些单词获得很高的结果。但是,由于它们比Bed Frame更紧密匹配(因为那是2个令牌)。它们显示得很高。

这是我当前的查询

POST autocompletion/_search?pretty
{
  "query": {
    "function_score": {
      "query": {
        "match": {
          "keyword": {
            "query": "Bed",
            "fuzziness": 1,
            "minimum_should_match": "100%"
          }
        }
      },
      "field_value_factor": {
        "field": "bias",
        "factor": 1
      }
    }
  }
}

1 个答案:

答案 0 :(得分:1)

如果您在查询时使用https://www.elastic.co/guide/en/elasticsearch/reference/current/search-suggesters-completion.html中所述的弹性搜索完成建议程序,则

{
    "suggest": {
        "song-suggest" : {
            "prefix" : "bed", 
            "completion" : { 
                "field" : "suggest" 
            }
        }
    }
}

您将获得:

{
    "took": 13,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 0,
        "max_score": 0.0,
        "hits": []
    },
    "suggest": {
        "song-suggest": [
            {
                "text": "bed",
                "offset": 0,
                "length": 3,
                "options": [
                    {
                        "text": "Bed",
                        "_index": "autocomplete",
                        "_type": "_doc",
                        "_id": "1",
                        "_score": 34.0,
                        "_source": {
                            "suggest": {
                                "input": [
                                    "Bed"
                                ],
                                "weight": 34
                            }
                        }
                    },
                    {
                        "text": "Bed Frame",
                        "_index": "autocomplete",
                        "_type": "_doc",
                        "_id": "3",
                        "_score": 34.0,
                        "_source": {
                            "suggest": {
                                "input": [
                                    "Bed Frame"
                                ],
                                "weight": 34
                            }
                        }
                    }
                ]
            }
        ]
    }
}

如果您想改用search API,则可以使用2个查询:

  1. 前缀查询“ bed ****”
  2. 以“ bed”开头的名词

在这里映射:

{
    "mappings": {
        "_doc" : {
            "properties" : {
                "suggest" : {
                    "type" : "text",
                                      "fields" : {
                                            "keyword" : {
                                                "type" : "keyword"
                                            }
                                        }
                }
            }
        }
    }

这里是搜索查询:

{
    "query" : {
            "bool" : {
                "must" : [
                    {
                        "match" : {
                            "suggest" : "Bed"
                        }
                    }
                ],
                "should" : [
                    {
                        "prefix" : {
                            "suggest.keyword" : "Bed"
                        }
                    }
                ]
            }
        }
}

should子句将从“ Bed”开始增加文档。等等!