我正在使用Kibana查询
GET /MY_INDEX_HERE/_search
{
"query": {
"match": {
"AccountId":
"bc73afda-d4f2"
}
}
}
我希望它能给出结果。但是当我使用terms
查询时,它没有显示任何结果,尽管值是相同的。没有任何字符或大小写的差异,所有内容都是小写的。
我的最终目标是在C#代码中获得结果。
.Query(q => q.Raw(strQuery) && q.Terms(c => c.Name("by_account").Field(p => p.AccountsList).Terms(accountTerms))
使用此查询时,我得到的结果为零,但如果注解第二个查询,则会得到结果:
.Query(q => q.Raw(strQuery) //&& q.Terms(c => c.Name("by_account").Field(p => p.AccountsList).Terms(accountTerms))
现在我的
strQuery ={\"bool\":{\"must\":[{\"match_phrase_prefix\":{\"fullname\":\"test\"}}]}}
以及
List<string> accountTerms = new List<string>();
accountTerms.Add("bc73afda-d4f2");
AccountId
是GUID
类型,我不能在这里粘贴完整的值,因此它不是一个完整的值。
2条答案
按热度按时间h9a6wy2h1#
我假设您的数据存储在
text
字段中,这是一个分析字段类型。如果使用标准分析器,源代码
bc73afda-d4f2
将转换为两个标记bc73afda
和d4f2
,因此,如果查询术语bc73afda-d4f2
,则没有匹配的标记。现在您有不同的选项,具体取决于您想要实现什么以及您可以影响哪些部分(Elasticsearch和/或C#代码)。
1.您可以编辑第二个查询以使用
match
而不是term
。1.可以将第二个条件添加到现有的
strQuery
中,其内容大致如下:1.如果您的Map是一个多类型
text/keyword
字段,或者您可以将其转换为一个字段(或者仅使用keyword
字段而不是text
),则可以使用terms
查询来查询AccountId.keyword
字段。keyword
字段不会被分析,因此term
查询bc73afda-d4f2
将是一个不错的选择。1.你可以使用一个定制的分析器来重新索引你的数据。但是这可能是矫枉过正/错误的方法来解决你的问题。
ulmd4ohb2#
Kibana“terms”查询疑难解答
terms
查询是一个精确匹配查询,这意味着它在匹配查询输入或字段值之前不会对其进行分析。如果索引中的
AccountId
字段已Map为keyword
字段或keyword
类型的文本字段,则输入的bc73afda-d4f2
将被视为单个术语,并且仅当字段值完全匹配(包括大小写)时才匹配。检查
AccountId
的Map:如果字段的
type
为text
或keyword
,请调整查询以使用字段的确切大小写和值。或者,您可以使用
match_phrase
查询而不是terms
查询来匹配AccountId
字段的确切短语,而不考虑大小写。