Ваш запрос почти верен, единственное, что не было правильно переведено, - это эта часть запроса:
(isfree eq 'true' OR (isfree eq 'false' AND owned eq 'abc^5'))
Если я правильно понимаю ваш пост, в основном это говорит: увеличить поле 'own' с коэффициентом 5, если его значение равно 'ab c' и цена бесплатна . Чтобы реализовать это, вам необходимо использовать дополнительный запрос типа bool, который:
- Фильтрует результаты по
isFree: true
- Увеличивает собственное поле любых документов, соответствующих
abc
"bool": {
"filter": [
{
"term": {
"isFree": {
"value": false
}
}
}
],
"must": [
{
"term": {
"owned": {
"value": "abc",
"boost": 5
}
}
}
]
}
Поскольку это не предназначено для ограничения набора результатов, а только для повышения результатов, которые соответствуют этим критериям, приведенный выше запрос типа bool следует поместить в раздел should
родительского типа bool. Окончательный запрос выглядит так:
POST /myindex/_search
{
"explain": true,
"query": {
"bool": {
"must": [
{
"multi_match": {
"query": "history",
"fields": [
"title^10",
"series"
]
}
}
],
"should": [
{
"term": {
"language": {
"value": "eng",
"boost": 5
}
}
},
{
"bool": {
"filter": [
{
"term": {
"isFree": {
"value": false
}
}
}
],
"must": [
{
"term": {
"owned": {
"value": "abc",
"boost": 5
}
}
}
]
}
}
]
}
}
}
Примечание: использование should
и must
дает одинаковые результаты для этого внутреннего bool, я, честно говоря, не уверен, что лучше использовать, поэтому я просто произвольно использовал must
.