英文:
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_phrase
instead 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/keyword
field or you can make it into one (or just use akeyword
field instead oftext
), you can query theAccountId.keyword
field with yourterms
query.keyword
fields are not analyzed, so theterm
query forbc73afda-d4f2
would 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"
}
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论