gpt4 book ai didi

elasticsearch - ElasticSearch数组数据与AND条件匹配嵌套元素中的多个属性

转载 作者:行者123 更新时间:2023-12-03 00:45:18 24 4
gpt4 key购买 nike

我遇到一个问题,我有两个文档,每个文档包含一个对象数组。我喜欢搜索一个文档,该文档包含一个嵌套对象的两个属性(在同一对象中同时匹配两个属性),但是我总是得到两个文档。
我用以下方法创建了文档:

POST /respondereval/_doc
{
"resp_id": "1236",
"responses": [
{"key": "meta","text":"abc"},
{"key": "property 1", "text": "yes"},
{"key": "property 2", "text": "yes"},
]
}

POST /respondereval/_doc
{
"resp_id": "1237",
"responses": [
{"key": "meta","text":"abc"},
{"key": "property 1", "text": "no"},
{"key": "property 2", "text": "yes"},
]
}
我为它们定义了一个索引,以防止ES扁平化对象,如下所示:
PUT /respondereval
{
"mappings" : {
"properties": {
"responses" : {
"type": "nested"
}
}
}
}
我现在想使用以下查询搜索第一个文档( resp_id 1236):
GET /respondereval/_search
{
"query": {
"nested": {
"path": "responses",
"query": {
"bool": {
"must": [
{ "match": { "responses.key": "property 1" } },
{ "match": { "responses.text": "yes" } }
]
}
}
}
}
}
这只能返回一个同时符合两个条件的元素。
不幸的是,它总是返回两个文档。我认为这是因为在某些时候,ES仍将嵌套对象数组中的值展平为如下所示(简化):
resp_id 1236: "key":["gender", "property 1", "property 2"], "text:["abc", "yes", "yes"]
resp_id 1237: "key":["gender", "property 1", "property 2"], "text:["abc", "no", "yes"]
两者都包含 property1yes
解决此问题的正确方法是什么,以便仅返回包含对象数组中同时与两个条件( "key": "property 1" AND "text": "yes")匹配的元素的文档?

最佳答案

问题出在您的映射上。您具有默认情况下使用标准分析器的文本映射。
标准分析器在空格上创建 token 。所以property 1将标记为

{
"tokens": [
{
"token": "property",
"start_offset": 0,
"end_offset": 8,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "1",
"start_offset": 9,
"end_offset": 10,
"type": "<NUM>",
"position": 1
}
]
}
同样, property 2也是如此。
因此,两个文件都被退回。
当您搜索 yes时,它与第二个文档中的第二个文本匹配。 property 1property分析的文档中第二个键的 token 匹配。
要使其起作用:-使用 keyword变体
{
"query": {
"nested": {
"path": "responses",
"query": {
"bool": {
"must": [
{ "match": { "responses.key.keyword": "property 1" } },
{ "match": { "responses.text.keyword": "yes" } }
]
}
}
}
}
}
这将是正确的:
{
"query": {
"nested": {
"path": "responses",
"query": {
"bool": {
"must": [
{ "match_phrase": { "responses.key": "property 1" } },//phrase queries
{ "match": { "responses.text": "yes" } }
]
}
}
}
}
}

关于elasticsearch - ElasticSearch数组数据与AND条件匹配嵌套元素中的多个属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63234185/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com