弹性搜索输入分析

时间:2015-06-27 16:35:46

标签: search elasticsearch full-text-search search-engine

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

  

4star wi-fi 99 $

我们正在使用ES搜索酒店,是否可以将此字符串分析/标记为 4star - hotel level, wi-fi - hotel amenities, 99$ - price

是的,这是一个noob问题:)

1 个答案:

答案 0 :(得分:2)

是和否。

默认情况下,query_string searches会对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星我希望,而是有一些复选框或其他基于表单的选择,所以这应该是非常现实的。

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