elasticsearch - 如何过滤对象属性的查询

时间:2014-05-03 16:14:02

标签: elasticsearch

在我的文档中,我有一个对象,用户ID为属性

{
    name:"bill"
    connections:{
        352077: {
            id          :352077
            username    :john
            genre       :"M"
        }
        3472236: {
            id          :3472236
            username    :cris
            genre       :"F"
        }
        4967367: {
            id          :4967367
            username    :mary
            genre       :"F"
        }
    }
}

如何执行查询以获取仅与流派=" F" 的连接?

要运行更新查询,这很有效:

{script:"for(i:ctx._source['connections'].entrySet()){ i.value.genre = 'F'; }"}

但我不知道如何作为GET查询运行。

1 个答案:

答案 0 :(得分:1)

我认为你应该重新构建你的文件

curl -XPUT 'http://localhost:9200/myindex/connection/bill_352077' -d '{
    "name":"bill",
    "id":352077,
    "username":"john",
    "genre":"M"      
}'

curl -XPUT 'http://localhost:9200/myindex/connection/bill_3472236' -d '{
    "name":"bill",
    "id":3472236,
    "username":"cris",
    "genre":"F"    
}'

curl -XPUT 'http://localhost:9200/myindex/connection/bill_4967367' -d '{
    "name":"bill",
    "id":4967367,
    "username":"mary",
    "genre":"F"     
}'

curl -XPUT 'http://localhost:9200/myindex/connection/bob_12345' -d '{
    "name":"bob",
    "id":12345,
    "username":"rosie",
    "genre":"F"     
  }'

curl -XGET 'http://localhost:9200/myindex/connection/_search?q=genre:F%20AND%20name:bill'

如果这不是一个选项,你可以试试multi_search查询

{
   "query":{
      "multi_match":{
         "query":"F",
         "fields":[
            "connections.*.genre"
         ]
      }
   }
}

但这并不适用于您的文档结构,因为它不会缩进在文档中搜索并仅返回搜索匹配的部分。 https://github.com/elasticsearch/elasticsearch/issues/3022

也许你通过嵌套映射来解决它, http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-nested-type.html 但是你只能通过嵌套查询来访问这些文档,而这通常不是你想要的。