#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"
}
}
}
}
]
}
}
}