英文:
Elastic Search Terms query not giving result but match query is giving
问题
我正在使用Kibana查询,它给我返回了我期望的结果。但是当我使用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 类型,我不能在这里粘贴完整的值,因此这不是完整的值。
英文:
I am using a Kibana query
GET /MY_INDEX_HERE/_search
{
"query": {
"match": {
"AccountId":
"bc73afda-d4f2"
}
}
}
and it is giving me the results, I expect. But when I use a terms query, it is not showing any result, although the values are same. There is no difference in any character or any case, everything is lower-case only.
My final goal is to get the result in my C# code. My query is
.Query(q => q.Raw(strQuery) && q.Terms(c => c.Name("by_account").Field(p => p.AccountsList).Terms(accountTerms))
With this query I am getting zero results, but if I comment the second query I am getting results:
.Query(q => q.Raw(strQuery) //&& q.Terms(c => c.Name("by_account").Field(p => p.AccountsList).Terms(accountTerms))
Right now my
strQuery ={\"bool\":{\"must\":[{\"match_phrase_prefix\":{\"fullname\":\"test\"}}]}}
and
List<string> accountTerms = new List<string>();
accountTerms.Add("bc73afda-d4f2");
The AccountId is a GUID type, I cant paste the full value here, hence it's not a complete value.
答案1
得分: 1
-
假设您的数据存储在一个名为
text的字段中,该字段是一个经过分析的字段类型。 -
如果您使用标准分析器,您的源代码
bc73afda-d4f2会被转换成两个标记,即bc73afda和d4f2。因此,如果您查询术语bc73afda-d4f2,则没有匹配的标记。 -
现在您有不同的选择,具体取决于您想要实现什么,以及您可以影响哪些部分(Elasticsearch 和/或 C# 代码)。
-
您可以编辑第二个查询,改为使用
match_phrase而不是term。 -
您可以将第二个条件添加到现有的
strQuery中,类似于以下内容:"bool":{"must":[{"match_phrase_prefix":{"fullname":"test"}},{"match_phrase":{"AccountId":"bc73afda-d4f2"}}]} -
如果您的映射是一个多类型的
text/keyword字段,或者您可以将其转换为多类型字段(或者只需使用keyword字段而不是text),您可以使用AccountId.keyword字段进行terms查询。keyword字段不经过分析,因此对于bc73afda-d4f2的term查询会匹配。 -
您还可以使用自定义分析器并重新索引您的数据。但这可能是过度复杂或错误的解决方案。
英文:
I assume that your data is stored in a text field, which is an analyzed field type.
If you are using the standard analyzer, your source bc73afda-d4f2 is transformed into the two tokens bc73afda and d4f2. Therefore, if you're querying for the term bc73afda-d4f2 there is no token that matches .
You have different options now, depending on what you want to achieve exactly and which parts you can influence (Elasticsearch and/or C# code).
-
You could edit your second query to use
match_phraseinstead ofterm. -
You could add your second condition to the existing
strQuery. That would be something along the lines of:\"bool\":{\"must\":[{\"match_phrase_prefix\":{\"fullname\":\"test\"}},{\"match_phrase\":{\"AccountId\":\"bc73afda-d4f2\"}}]}} -
If your mapping is a multi-type
text/keywordfield or you can make it into one (or just use akeywordfield instead oftext), you can query theAccountId.keywordfield with yourtermsquery.keywordfields are not analyzed, so thetermquery forbc73afda-d4f2would be a hit. -
You could use a custom analyzer and reindex your data. But this is probably overkill/the wrong way to approach your issue.
答案2
得分: 1
Kibana故障排除 'terms' 查询
terms 查询是一种精确匹配查询,这意味着它不会在匹配之前分析查询输入或字段值。
如果您的索引中的 AccountId 字段已映射为 keyword 字段或带有 keyword 类型的文本字段,那么输入 bc73afda-d4f2 将被视为单个术语,只有在字段值完全匹配,包括大小写时才会匹配。
检查 AccountId 的映射:
GET /MY_INDEX_HERE/_mapping/field/AccountId
如果字段的 type 是 text 或 keyword,请调整查询以使用字段的确切大小写和值。
或者,您可以使用 match_phrase 查询而不是 terms 查询来匹配 AccountId 字段的确切短语,而不考虑大小写。
GET /MY_INDEX_HERE/_search
{
"query": {
"match_phrase": {
"AccountId": "bc73afda-d4f2"
}
}
}
英文:
Troubleshooting Kibana 'terms' Query
The terms query is an exact match query, which means it doesn't analyze the query input or the field values before matching them.
If the AccountId field in your index has been mapped as a keyword field or a text field with the keyword type, then the input bc73afda-d4f2 will be treated as a single term, and it will only match if the field value is an exact match, including case.
Check the mapping of the AccountId:
GET /MY_INDEX_HERE/_mapping/field/AccountId
If the type of the field is text or keyword, Adjust your query to use the exact case and value of the field.
Alternatively, you can use a match_phrase query instead of the terms query to match the exact phrase of the AccountId field, regardless of the case.
GET /MY_INDEX_HERE/_search
{
"query": {
"match_phrase": {
"AccountId": "bc73afda-d4f2"
}
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论