Поиск в двух разных типах с разными отображениями в Elasticsearch

#elasticsearch

#elasticsearch

Вопрос:

Имея следующее отображение индекса tester с двумя типами items и items_two :

 curl -XPUT 'localhost:9200/tester?pretty=true' -d '{
  "mappings": {
      "items": {
         "properties" : {
           "body" : { "type": "string" }
}},
      "items_two": {
         "properties" : {
           "body" : { "type": "string" },
           "publised" : { "type": "integer"}
}}}}'
  

Я поместил в него три элемента.

 curl -XPUT 'localhost:9200/tester/items/1?pretty=true' -d '{
     "body" : "Hey there im reading a book"
}'

curl -XPUT 'localhost:9200/tester/items_two/1?pretty=true' -d '{
     "body" : "I love the new book of my brother",
     "publised" : 0
}'

curl -XPUT 'localhost:9200/tester/items_two/2?pretty=true' -d '{
     "body" : "Stephen kings book is very nice",
     "publised" : 1
}'
  

Мне нужно создать запрос, который соответствует слову book и имеет published = 1 , И те, которые не имеют published в сопоставлении, но имеют book в нем (как единственный элемент items ).

С помощью следующего запроса я получаю совпадение только с "Stephen kings book is very nice" элементом (очевидно).

 curl -XGET 'localhost:9200/tester/_search?pretty=true' -d '{
"query": {
 "bool": {
      "must": [
      {
            "match": { "body": "book" }
      },
      {
            "match": { "publised": "1" }
      }]
}}}'
  

Мой желаемый результат при поиске строки book должен соответствовать элементу № 1 из типа items ( "Hey there im reading a book" ) и item № 2 из типа items_two ( "Stephen kings book is very nice" ).

Я не хочу менять отображение или что-либо еще, мне нужно заархивировать это с помощью одного запроса, так как я могу построить свой запрос?

Заранее спасибо.

Ответ №1:

Вы можете использовать поле _type для такого рода поиска. Попробуйте выполнить следующий запрос

 {
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "match": {
                  "body": "text"
                }
              },
              {
                "match": {
                  "publised": "1"
                }
              }
            ],
            "filter": {
              "term": {
                "_type": "items_two"
              }
            }
          }
        },
        {
          "bool": {
            "must": [
              {
                "match": {
                  "body": "text"
                }
              }
            ],
            "filter": {
              "term": {
                "_type": "items"
              }
            }
          }
        }
      ]
    }
  }
}