当我搜索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"
}
答案 0 :(得分:1)
您没有包含您的映射,但我怀疑name
的映射类似于{"type": "string", "index": "analyzed"}
(或等效的{"type": "string"}
- 默认值已分析)。匹配是单独的条款(不是原始字符串),Product-Product1
使用标准分析器编制索引时创建的各个术语是Product
和Product1
。当然Product1
匹配。
您必须使用"index": "not_analyzed"
重新编制索引,或使用该映射添加新字段。 (实际上,如果您希望product1
匹配Product1
,您可能需要进行一些分析 - 在这种情况下,我认为您希望使用带有关键字标记器和小写过滤器的自定义分析器。)
答案 1 :(得分:0)
您确定必须搜索product1*
而不是Product1.*
吗?基本上你想要匹配Product1 0或moer时间之后的任何字符。请阅读lucene here使用的正则表达式文档。
PS:我用我的正则表达式在kibana中试用了你的用例,它按预期工作。