Elasticsearch从使用部分匹配查询的搜索开始

时间:2017-08-26 12:16:20

标签: elasticsearch

当我搜索product1时,我应该得到:

Product1
Product1/Product1
Product1-Product
Product1\Product1

然而我得到了这些:

Product1
Product1/Product1
Product1-Product
Product1\Product1
Product-Product1
Product\Product1
Product Product1

所以下面的示例查询就像... name LIKE '*product1*'而不是... LIKE 'product1*'一样运行。我已经完成Partial Matching documentation但无法解决问题。映射中name字段为not_analyzed字符串。

{"query":{"prefix":{"name":"product1"}}}

{"query":{"wildcard":{"name":"product1*"}}}

{"query":{"regexp":{"name":"product1*"}}}

{"query":{"bool":{"must":[{"wildcard":{"name":"product1*"}}]}}}

{"query":{"bool":{"must":{"wildcard":{"name":"product1*"}}}}}

{"query":{"filtered":{"filter":{"bool":{"must":{"regexp":{"name":"product1*"}}}}}}}

我的ES版I know it is a bit old):

{
  "status" : 200,
  "name" : "Hannah Levy",
  "cluster_name" : "elasticsearch",
  "version" : {
    "number" : "1.7.2",
    "build_timestamp" : "2015-09-14T09:49:53Z",
    "build_snapshot" : false,
    "lucene_version" : "4.10.4"
  },
  "tagline" : "You Know, for Search"
}

2 个答案:

答案 0 :(得分:1)

您没有包含您的映射,但我怀疑name的映射类似于{"type": "string", "index": "analyzed"}(或等效的{"type": "string"} - 默认值已分析)。匹配是单独的条款(不是原始字符串),Product-Product1使用标准分析器编制索引时创建的各个术语是ProductProduct1。当然Product1匹配。

您必须使用"index": "not_analyzed"重新编制索引,或使用该映射添加新字段。 (实际上,如果您希望product1匹配Product1,您可能需要进行一些分析 - 在这种情况下,我认为您希望使用带有关键字标记器和小写过滤器的自定义分析器。)

答案 1 :(得分:0)

您确定必须搜索product1*而不是Product1.*吗?基本上你想要匹配Product1 0或moer时间之后的任何字符。请阅读lucene here使用的正则表达式文档。

PS:我用我的正则表达式在kibana中试用了你的用例,它按预期工作。