所以我有一个对象,其ID字段由Guid填充。我正在使用“必须”子句进行Elasticsearch查询,以匹配该字段中的特定ID。问题是elasticsearch返回的结果与我提供的Guid完全不匹配。我注意到我正在提供的Guid,Elasticsearch返回的结果之一在Guid的特定部分共享相同的数字。
这是我的查询源(我正在使用Elasticsearch控制台):
{ query: { bool: { must: [ { text: { couchbaseDocument.doc.Id: 5cd1cde9-1adc-4886-a463-7c8fa7966f26 } }] must_not: [ ] should: [ ] } } from: 0 size: 10 sort: [ ] facets: { } }
它返回两个结果。编号为
5cd1cde9-1adc-4886-a463-7c8fa7966f26
另一个ID为
34de3d35-5a27-4886-95e8-a2d6dcf253c2
如您所见,它们都有相同的中间术语“ -4886-”。但是,我希望该查询仅在记录完全匹配而不是部分匹配时才返回记录。我在这里做错了什么?
该查询是(可能)正确的。
您几乎可以肯定看到的是“标准分析器”的工作,默认情况下在索引时间使用它。该分析器将在连字符('-')和其他字符中标记输入(将其分割为术语)。这就是找到匹配项的原因。
为了解决这个问题,您想将couchbaseDocument.doc.Id
字段设置为not_analyzed
请参阅:如何在ElasticSearch中不进行分析?以及从那里到官方文档的链接。
映射将类似于:
{ "yourType" : { "properties" : { "couchbaseDocument.doc.Id" : {"type" : "string", "index" : "not_analyzed"}, } } }