我的解决方案历险记
如您在我的问题中所见,我已经开始审理案件。每当我更改了一部分设置后,一部分便开始工作,而另一部分则停止工作。让我给出我的解决方案历史记录:
1.) 我已将数据索引为默认值。这意味着,我的数据是
analyzed默认的。这将在我这方面引起问题。例如;
当用户开始搜索诸如 SVF-1 的关键字时,系统将运行以下查询:
{ "query": { "filtered" : { "query" : { "query_string" : { "analyze_wildcard": true, "query": "*SVF-1*" } } } }}和结果;
SVF-123SVF-234
这是正常现象,因为
name我的文档字段是
analyzed。这将查询分为记号
SVF和
1,并
SVF与我的文档匹配,尽管
1不匹配。我已经跳过了。我为我的字段创建了一个映射
not_analyzed
{ "mappings":{ "product":{ "properties":{"name":{ "type":"string", "index": "not_analyzed"},"site":{ "type":"string", "index": "not_analyzed"} } } }}但我的问题仍然存在。
2.)
经过大量研究,我想尝试另一种方法。决定使用通配符查询。我的查询是
{ "query": { "wildcard" : { "name" : { "value" : *SVF-1*" } } }, "filter":{ "term": {"site":"pro_en_GB"} } }}该查询有效,但是这里有一个问题。我的字段不再进行分析,我正在进行通配符查询。区分大小写是这里的问题。如果我像 svf-1
一样搜索,它什么也不会返回。因为,用户可以输入小写版本的查询。
3.) 我将文档结构更改为;
{ "mappings":{ "product":{ "properties":{"name":{ "type":"string", "index": "not_analyzed"},"nameLowerCase":{ "type":"string", "index": "not_analyzed"}"site":{ "type":"string", "index": "not_analyzed"} } } }}我还增加了一个
name名为的字段
nameLowerCase。索引文档时,我将文档设置为:
{ name: "SVF-123", nameLowerCase: "svf-123", site: "pro_en_GB"}在这里,我将查询关键字转换为小写并在新
nameLowerCase索引上进行搜索操作。并显示
name字段。
我查询的最终版本是;
{ "query": { "wildcard" : { "nameLowerCase" : { "value" : "*svf-1*" } } }, "filter":{ "term": {"site":"pro_en_GB"} } }}现在可以了。还有一种使用multi_field解决此问题的方法。我的查询包含破折号(-),并且遇到了一些问题。
非常感谢@Alex Brasetvik的详细解释和努力



