【问题标题】:Elasticsearch suggest function with like in prefixElasticsearch 建议带有 like 前缀的函数
【发布时间】:2018-02-27 13:11:01
【问题描述】:

我有一个索引,其中存储了一些名称。

PUT localhost:9200/myIndex
{
  "mappings": {
    "record" : {
      "properties" : {
        "namesuggest" : {
          "type" :     "completion"
        }
      } 
    }
  }
}

所以我输入了一些记录:

PUT localhost:9200/myindex/record/1
{
  "namesuggest" : "Homer Simpson"
}

PUT localhost:9200/myindex/record/2
{
   "namesuggest" : "Bart Simpson"
}

    PUT localhost:9200/myindex/record/3
{
  "namesuggest" : "Marge Simpson"
}

通过这个查询,我得到了建议:

POST localhost:9200/myindex/_search
{
    "suggest": {
        "name-suggest" : {
            "prefix" : "bart",
            "completion" : {
                  "field" : "namesuggest"
            }
        }
    }
}

如果我设置了prefix == bart,我已经返回了建议“Bart Simpson”,它是正确的。

我不明白为什么,如果我设置prefix == Simpson 我返回了空白结果。

我会得到一个匹配 %Simpson% 和类似 SQL 运算符的结果集:

  • 荷马辛普森

  • 巴特辛普森

  • 玛吉·辛普森

    如何查询?

【问题讨论】:

  • 因为辛普森是一个后缀。如果您需要快速的索引后缀搜索,推荐的技巧是在您的映射中添加一个多字段,其中包括一个反向令牌过滤器elastic.co/guide/en/elasticsearch/reference/current/…。然后,您可以在该反向字段上运行前缀查询,并以优化的方式获得后缀搜索。
  • 你能给我举个例子吗?

标签: elasticsearch autosuggest elasticsearch-query elasticsearch-mapping


【解决方案1】:

完成建议适用于 FST,并且它的实现针对前缀进行了优化。

而且由于字符串“Bart Simpson”不是以“Simpson”开头的,所以它不会匹配。

但是,您可以使用反向存储令牌的分析器。 IE。 “巴特辛普森”=> [辛普森,巴特]。然后当你搜索 Simpson 时,它确实匹配前缀。

参考:https://www.elastic.co/assets/bltced6bd71d5fa33ab/suggest_1.png?uid=bltced6bd71d5fa33ab

【讨论】:

    猜你喜欢
    • 2017-09-11
    • 2017-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-06
    • 1970-01-01
    • 2019-01-17
    相关资源
    最近更新 更多