我想用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
}
}
}
}
答案 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个查询:
在这里映射:
{
"mappings": {
"_doc" : {
"properties" : {
"suggest" : {
"type" : "text",
"fields" : {
"keyword" : {
"type" : "keyword"
}
}
}
}
}
}
这里是搜索查询:
{
"query" : {
"bool" : {
"must" : [
{
"match" : {
"suggest" : "Bed"
}
}
],
"should" : [
{
"prefix" : {
"suggest.keyword" : "Bed"
}
}
]
}
}
}
should子句将从“ Bed”开始增加文档。等等!