2013-03-29 2 views
2

Я изучаю Elasticsearch, поэтому я не уверен, что этот запрос верен. Я проверил, что данные индексируются, но я не получаю никаких хитов. Что я делаю не так? Разве это не должно попасть в автомобиль, где имя создателя steve?Запрос вложенного документа 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 был проиндексирован с использованием стандартного анализатора, то {"term": {"creators.name": "Steve"}} не найдет ничего, потому что слово Steve был проиндексирован, как steve и term query не выполняет анализ. Таким образом, было бы лучше заменить его на match query{"match": {"creators.name": "Steve"}}.

+0

Спасибо! Мне пришлось переместить поле пути из объекта запроса, хотя и вставить «создателей» в путь, и использовать термин creators.name в терминах. Это звучит неправильно или это правильно? – LuckyLuke

+0

Да, вы правы. Путь должен быть на том же уровне, что и запрос, и должен содержать «car.creators». Я обновил этот пример. Не уверен в creators.name в терминах. Является ли автомобиль типом в вашем случае? – imotov

+0

Да, автомобиль есть тип? Поскольку я узнаю об Elasticsearch, не могли бы вы объяснить, почему мне это не нужно, и вам удается заставить его работать с ним? – LuckyLuke

Смежные вопросы