【问题标题】:Elasticsearch autocomplete suggesterElasticsearch 自动完成建议器
【发布时间】:2020-07-14 10:04:13
【问题描述】:

我想在 ES 中实现自动完成功能,我遵循了 ES 文档中的 this 教程

我的索引是:

{
    "properties" : {
            "suggest" : {
                "type" : "completion"
            },
            "titleKeyword" : {
                "type": "keyword"
            }
        }
    }
}

我将文本值放入titleKeyword 字段中

然后我像下面这样查询

{
  "suggest" : {
    "my-suggestion" : {
      "text" : "iphone",
      "term" : {
        "field" : "titleKeyword"
      }
    }
  }
}

结果是:

...
    "suggest": {
        "my-suggestion": [
            {
                "text": "iphone",
                "offset": 0,
                "length": 6,
                "options": []
            }
        ]
    }

预期结果是

options:[iphone x, iphone 11, iphone 11 pro, iphone 7]

注意:标题是完整的句子,例如“iPhone x 64gb black”

据我从文档中了解到,我必须在创建文档时“提前”给出建议,这在我的情况下是不可能的,有没有办法在不手动提出建议的情况下实现此功能?

谢谢

【问题讨论】:

  • 所以基本上你有包含 iphone x、iphone 11、iphone 11 pro、iphone 7 的文档,当搜索 iphone 时,你希望它们都出现在搜索结果中?
  • @OpsterElasticsearchNinja 完全一样
  • 根据您的要求提供答案:)
  • 你有机会看我的回答吗
  • @OpsterElasticsearchNinja 非常感谢您的回答,但不幸的是,它并不能完全解决我的情况我可以进行正则表达式查询并获取包含查询文本的文档(因为标题可能包含更多 tahn一个词,例如 iphone x 32gb storage silver ) 所以当我写 iphone 时,我想向我推荐 iphone x、iphone 7 等等,即不是文档标题,而是文档标题中的关键字

标签: elasticsearch elastic-stack elasticsearch-5


【解决方案1】:

对于这个简单的要求,不需要使用难以理解的 Elasticsearch 建议器,并且它的某些部分仍在开发中,有关构建高级自动完成时需要注意的更多信息,请参阅我的 this SO answer

满足您的要求,使用text 字段(看起来您正在使用keyword 类型)和简单的匹配查询可以轻松解决,如下所示:

索引定义

{
    "mappings": {
        "properties": {
            "model_name": {
                "type": "text"
            }
        }
    }
}

索引所有 4 种类型的iphone

{
   "model_name" : "iphone x"
}

{
   "model_name" : "iphone 11"
}

{
   "model_name" : "iphone 11 pro"
}

{
   "model_name" : "iphone 7"
}

搜索查询(iphone 将带来所有四个文档)

{
    "query": {
        "match": {
            "model_name": {
                "query": "iphone"
            }
        }
    }
}

搜索结果

{
            "_index": "so_auto",
            "_type": "_doc",
            "_id": "1",
            "_score": 0.110377684,
            "_source": {
               "model_name": "iphone x"
            }
         },
         {
            "_index": "so_auto",
            "_type": "_doc",
            "_id": "2",
            "_score": 0.110377684,
            "_source": {
               "model_name": "iphone 11"
            }
         },
         {
            "_index": "so_auto",
            "_type": "_doc",
            "_id": "4",
            "_score": 0.110377684,
            "_source": {
               "model_name": "iphone 7"
            }
         },
         {
            "_index": "so_auto",
            "_type": "_doc",
            "_id": "3",
            "_score": 0.09271726,
            "_source": {
               "model_name": "iphone 11 pro"
            }
         }
      ]

【讨论】:

    猜你喜欢
    • 2017-09-11
    • 2022-01-22
    • 1970-01-01
    • 2022-01-18
    • 2014-08-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 2015-02-19
    相关资源
    最近更新 更多