如何使用Hashmap查询ElasticSearch

s8vozzvw  于 2023-01-20  发布在  ElasticSearch
关注(0)|答案(1)|浏览(107)

我想查询ElasticSearch与Map的价值和检索的文件。

    • 示例**:我已将以下两份文件编入索引
1. {
      "timestamp": 1601498048,
      "props": {
        "cp1": "cv1",
        "cp2": "cv2"
      }
    }

2. {
      "timestamp": 1601498098,
      "props": {
        "key1": "v1",
        "key2": "v2"
      }
    }

因此,我想使用整个Map值props进行查询,其中

"props" 
  {
     "cp1": "cv1",
     "cp2": "cv2"
 }

并且只返回所有匹配的Map值的文档,所以在这种情况下,结果只会是第一个文档,因为它匹配了给定的属性。
我可以查询只有一个像下面的Map值,但需要搜索整个Map。

curl -X GET "localhost:9200/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query": {        
 "bool" : {
   "must" : [
     {                    
     "terms" : {
       "customProperties.cp1.keyword" : [ "cv1" ]
     }
    }
    ]
 }
 }
}
'

那么我们如何查询整个map props,并仅在所有map键值匹配时返回文档呢?

    • 更新**主要是我需要一个QueryBuilder来搜索值的Map。我可以做的一组值如下
val sampleSet = setOf("foo", "bar")

val query = NativeSearchQueryBuilder()
           .withQuery(
               QueryBuilders.termsQuery(
                   "identifiers.endpointId.keyword", sampleSet)
            )
            .build()

我需要QueryBuilder来搜索ES索引中的值Map,并且仅当整个Map值匹配时才返回文档。
请提建议。

unftdfkk

unftdfkk1#

你必须应用双重匹配条款。

{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "props.cp1": "cv1"
          }
        },
        {
          "match": {
            "props.cp2": "cv2"
          }
        }
      ]
    }
  }
}

或术语。

{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "props.cp1.keyword": "cv1"
          }
        },
        {
          "term": {
            "props.cp2.keyword": "cv2"
          }
        }
      ]
    }
  }
}

相关问题