2013-03-29 169 views
2

我在学习Elasticsearch,所以我不确定这个查询是否正确。我已检查过数据是否已编入索引,但我没有收到任何匹配。我究竟做错了什么?这不应该在创作者的名字是史蒂夫的汽车上受到打击吗?查询嵌套文档Elasticsearch

builder 
.startObject() 
    .startObject("car") 
     .field("type", "nested") 
     .startObject("properties") 
      .startObject("creators") 
       .field("type", "nested")      
      .endObject()     
     .endObject() 
    .endObject() 
.endObject(); 


{ 
    "query": { 
    "bool": { 
     "must": [ 
     { 
      "term": { 
      "car.creators.name": "Steve" 
      } 
     } 
     ], 
     "must_not": [], 
     "should": [] 
    } 
    }, 
    "from": 0, 
    "size": 50, 
    "sort": [], 
    "facets": {} 
} 

回答

8

首先,为了寻找你需要使用nested query嵌套字段:

curl -XDELETE localhost:9200/test 
curl -XPUT localhost:9200/test -d '{ 
    "settings": { 
     "index.number_of_shards": 1, 
     "index.number_of_replicas": 0 
    }, 
    "mappings": { 
      "car": { 
       "properties": { 
        "creators" : { 
         "type": "nested", 
         "properties": { 
          "name": {"type":"string"} 
         } 
        } 
       } 
      } 
     } 
    } 
} 
' 
curl -XPOST localhost:9200/test/car/1 -d '{ 
    "creators": { 
     "name": "Steve" 
    } 
} 
' 
curl -X POST 'http://localhost:9200/test/_refresh' 
echo 
curl -X GET 'http://localhost:9200/test/car/_search?pretty' -d ' { 
    "query": { 
     "nested": { 
      "path": "creators", 
      "query": { 
       "bool": { 
        "must": [{ 
         "match": { 
          "creators.name": "Steve" 
         } 
        }], 
        "must_not": [], 
        "should": [] 
       } 
      } 
     } 
    }, 
    "from": 0, 
    "size": 50, 
    "sort": [], 
    "facets": {} 
} 
' 

如果car.creators.name使用标准分析仪指数则因为字Steve被收录为steve{"term": {"creators.name": "Steve"}}不会找到任何东西而term query不执行分析。所以,最好用match query{"match": {"creators.name": "Steve"}}来代替它。

+0

谢谢!我必须将路径字段移出查询对象,并在路径中插入“创建者”,并仅在该术语中使用creators.name。这听起来是错的还是对的? – LuckyLuke

+0

是的,你是对的。路径应与查询处于同一级别,并应包含“car.creators”。我已经更新了这个例子。不确定该术语中的creators.name。你的情况是汽车吗? – imotov

+0

是的,汽车是一种类型?由于我正在学习Elasticsearch,你会介意解释为什么我不需要它,并设法使它与它一起工作吗? – LuckyLuke