Запрос ElasticSearch lucene с преобразованием подпунктов в синтаксис ES - PullRequest
1 голос
/ 19 июня 2020

Я пытался преобразовать запрос в стиле 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'))

Здесь говорится, что «найдите мне соответствие истории в 'title' или 'series', но увеличьте совпадение заголовка И там, где язык не должен быть английским sh, но если если, то увеличьте его И там, где совпадение является бесплатным или где оно не бесплатно, убедитесь, что оно принадлежит клиенту ab c ".

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

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

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

1 Ответ

0 голосов
/ 19 июня 2020

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

(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.

...