elasticsearch Elasticsearch高级自动完成
我想用Elasticsearch自动完成用户输入。现在有大量的教程介绍如何做到这一点,但没有一个真正详细的内容 我在查询中遇到的最后一个问题是,它应该对不是真正的“自动完成”的结果进行评分。例子: 是: 我输入:“床” 我发现:“床”、“大床”、“花式床”、“床架” 想要: 我输入:“床” 我发现:“床”、“床架”、“其他“床XXX”结果”、“花式床”、“大床” 因此,我希望Elasticsearch首先完成“向右”,如果这有意义的话。然后使用前面有单词的结果。 我试过完成建议,我不做我想做的其他事情,但也有同样的问题 在德语中有很多像Bigbed这样的词的例子(我知道这在英语中不是一个真正的词。但我不希望这些词有很高的效果。但是因为它们比Bed Frame更接近匹配(因为这是两个标记),所以它们显示得很高 这是我目前的查询:
elasticsearch Elasticsearch高级自动完成,
elasticsearch,autocomplete,lucene,autosuggest,
elasticsearch,Autocomplete,Lucene,Autosuggest,我想用Elasticsearch自动完成用户输入。现在有大量的教程介绍如何做到这一点,但没有一个真正详细的内容 我在查询中遇到的最后一个问题是,它应该对不是真正的“自动完成”的结果进行评分。例子: 是: 我输入:“床” 我发现:“床”、“大床”、“花式床”、“床架” 想要: 我输入:“床” 我发现:“床”、“床架”、“其他“床XXX”结果”、“花式床”、“大床” 因此,我希望Elasticsearch首先完成“向右”,如果这有意义的话。然后使用前面有单词的结果。 我试过完成建议,我不做我想做的其
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
}
}
}
}
如果您在查询时使用elasticsearch completion suggester,如中所述,如:
{
"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
}
}
}
]
}
]
}
}
如果要改用搜索
API,可以使用2个查询:
{
"mappings": {
"_doc" : {
"properties" : {
"suggest" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword"
}
}
}
}
}
}
以下是搜索查询:
{
"query" : {
"bool" : {
"must" : [
{
"match" : {
"suggest" : "Bed"
}
}
],
"should" : [
{
"prefix" : {
"suggest.keyword" : "Bed"
}
}
]
}
}
}
should子句将增强以“Bed”开头的文档。Et voilá!确定我的示例有点不好。如果我添加Bigbed作为建议(我没有一个好的英语示例,德语中有很多(Beistellbett)),完成建议器将在床后返回Bigbed。因为它与床比床框更接近(2个标记).我不想要任何像XXXBed一样的结果(最好的情况我希望他们得分最低)我已经更新了答案,使用搜索API,想法就在这里,你可以根据自己的需要进行一些调整。现在仍然会返回类似花式床作为第二个而不是床框架的内容。你是否使用此映射创建了一个新索引?我刚刚测试过,这在你的3个示例中运行良好。