弹性搜索输入分析

Elastic Search input analysis

Elastic Search 可以将输入字符串拆分为分类词吗?即如果输入是

4star wi-fi 99$

我们正在使用 ES 搜索酒店,是否可以 analyze/tokenize 此字符串作为 4star - hotel level, wi-fi - hotel amenities, 99$ - price?

是的,这是一个菜鸟问题:)

是也不是。

默认情况下,query_string searches will work against the automatically created _all field_all 字段的内容来自字面上和天真地将所有字段组合成一个分析过的字符串。

因此,如果您有“4 星”评级、"wi-fi" 便利设施和“99 美元”价格,那么所有这些值都将在 _all 字段内,并且你应该得到相关的打击。例如:

{
  "level" : "4star",
  "amenity" : ["pool", "wi-fi"],
  "price" : 99.99
}

问题是,如果没有客户端的努力,您将不知道在搜索 _all 时匹配了哪些字段。它不会告诉您每个值的来源细分,而只会报告确定整体相关性的分数。

如果有办法知道每个词(或词)要搜索哪个字段,那么您可以轻松自己做(不需要引号,但最好避免空格错误)。这将是您可以提供给上面链接的 query_string 查询的输入:

level:"4star" amenity:"wi-fi" price:(* TO 100)

您可以使用拼写查询进一步复杂化:

{
  "query" : {
    "bool" : {
      "must" : [
        { "match" : { "level" : "4star" } },
        { "match" : { "amentiy" : "wi-fi" } },
        {
          "range" : {
            "price" : {
              "lt" : 100
            }
          }
        }
      ]
    }
  }
}

自然地,最后两个请求需要关于每个搜索词所引用的内容的高级知识。您当然可以使用“99$”中的 $ 作为价格提示,但不能用于其他提示。我希望你不会让他们输入 4 星,而是让他们输入一些复选框或其他基于表单的选择,所以这应该是非常现实的。

从技术上讲,您可以创建一个自定义分析器,根据每个术语的位置识别每个术语,但这并不是一个好主意或有用的想法。