Запрос ElasticSearch lucene с преобразованием подпунктов в синтаксис ES

Я пытался преобразовать запрос в стиле lucene в синтаксис запроса ES, но я застрял в подпунктах. например

(title:history^10 or series:history) and (NOT(language:eng) OR language:eng^5) and (isfree eq 'true' OR (isfree eq 'false' AND owned eq 'abc^5'))

В нем говорится, что «дайте мне совпадение для истории в« названии »или« сериале », но улучшите совпадение заголовка И где язык не обязательно должен быть английским, но если это так, то улучшите его И где совпадение бесплатное или где это не бесплатно, убедитесь, что оно принадлежит клиенту abc".

Я чувствую, что это сложный запрос, но, похоже, он работает правильно. Преобразование предложений в синтаксис ES сбивает меня с толку, поскольку у меня нет концепции скобок. Я думаю, что мне нужно использовать логические запросы ... У меня есть следующее, которое, как я знаю, неправильно применяет критерии - оно говорит, что вы должны иметь (язык: eng ИЛИ isFree eq 'true' ИЛИ ​​владелец: abc). Кажется, я не могу сделать мысленный скачок, чтобы построить «должен/должен» с НЕ в нем.

Помогите, пожалуйста?

  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "query": "history",
            "fields": [
              "title^10.0",
              "series"              
            ]
          }
        }
      ],
      "should": [
        {
          "term": {
            "language": {
              "value": "eng",
              "boost": 5
            }
          }
        },
        {
          "term": {
            "isFree": {
              "value": true
            }
          }
        },
        {
          "term": {
            "owned": {
              "value": "abc",
              "boost": 5
            }
          }
        }
      ]
    }
  },

person GrahamB    schedule 19.06.2020    source источник


Ответы (1)


Ваш запрос почти правильный, единственное, что не было переведено правильно, это часть запроса:

(isfree eq 'true' OR (isfree eq 'false' AND owned eq 'abc^5'))

Если я правильно понимаю ваше сообщение, это в основном говорит о том, что увеличьте поле «принадлежит» в пять раз, когда его значение равно «abc» и цена будет бесплатной. Для реализации этого необходимо использовать дополнительный логический запрос, который:

  • Фильтрует результаты по isFree: true
  • Увеличивает поле «владелец» любых документов, соответствующих abc
"bool": {
  "filter": [
    {
      "term": {
        "isFree": {
          "value": false
        }
      }
    }
  ],
  "must": [
    {
      "term": {
        "owned": {
          "value": "abc",
          "boost": 5
        }
      }
    }
  ]
}

Поскольку это не предназначено для ограничения набора результатов и повышения только результатов, соответствующих этим критериям, приведенный выше логический запрос должен быть помещен в раздел should родительского логического значения. Окончательный запрос выглядит так:

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 дает одинаковые результаты для этого внутреннего логического значения, я, честно говоря, не уверен, что лучше использовать, поэтому я просто произвольно использовал must.

person Syntactic Fructose    schedule 19.06.2020
comment
спасибо, не совсем то, что мне нужно, но достаточно близко для меня, чтобы разобраться. Бул внутри должен помочь. - person GrahamB; 24.06.2020
comment
@GrahamB Что вам нужно, что этот запрос не смог решить? - person Syntactic Fructose; 24.06.2020
comment
Просто применение логической логики немного отличалось от того, что мне было нужно, поэтому логическое значение owned и isfree должно было находиться в массиве must, который содержит множественное совпадение, а предложение must for language остается там, где оно есть. - person GrahamB; 26.06.2020