Elasticsearch DSL Filter - PullRequest
       8

Elasticsearch DSL Filter

0 голосов
/ 12 марта 2020

У меня проблема с фильтром поиска elasti c. Я пытаюсь найти текст с помощью фильтра elasti c -search DSL, но у меня возникла проблема с сортировкой.

Поиск текста: hello world

Other строка в документе: Привет, привет, привет всем, привет, привет , et c ...

Запрос Elasticsearch-dsl:

MyDocument.search().filter(Q("match", title="hello world") | Q("match", original_title="hello world")).execute()

Запрос Elasticsearch выглядит следующим образом:

{
    'bool': {
        'filter': [{
            'bool': {
                'should': [{
                    'match': {
                        'title': 'hello world'
                    }
                }, {
                    'match': {
                        'original_title': 'hello world'
                    }
                }]
            }
        }]
    }
}

Вывод выглядит как Привет всем, привет привет, привет мир , et c ..

но я хочу Привет, мир первый.

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

Ответы [ 2 ]

1 голос
/ 12 марта 2020

Из вашего запроса выясняется, что вы хотите искать один и тот же токен / токены из нескольких полей.

Конечно, @jaspreet упомянул нужный вам ответ, но если вы хотите упростить ваш запрос (конечно, Bool Queries также довольно прост), то вы можете использовать query_string как показано ниже:

POST <your_index_name>/_search
{
  "query": {
    "query_string": {
      "fields": ["title", "original_title"], 
      "query": "hello world",
      "default_operator": "OR"
    }
  }
}

Вы также можете использовать запрос multi-match , чтобы упростить ваш запрос, как показано ниже:

POST <your_index_name>/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "multi_match": {
            "query": "hello world",
            "fields": ["title", "original_title"],
            "operator": "OR"
          }
        }
      ]
    }
  }
}

In В обоих случаях вы получите желаемый результат.

Конечно, вам нужно проверить его и посмотреть, как выглядит ответ и какие варианты использования вы можете решить, используя их.

Примечание: Просто дополнительная заметка на основе комментария @ Val вы также можете использовать простую строку запроса вместо query_string, если входные данные поступают от пользователя, что, в отличие от query_string, не приводит к ошибкам из-за неверного синтаксиса ,

Надеюсь, это поможет!

0 голосов
/ 12 марта 2020

В вашем запросе вы используете «фильтр»

Параметр фильтра указывает контекст фильтра. Его предложения соответствия используются в контексте фильтра. Они будут отфильтровывать документы, которые не соответствуют, но они не будут влиять на оценку для соответствующих документов

Если вы проверите _score в возвращенных совпадениях, это будет ноль

Замените ваш запрос с

{
  "query": {
    "bool": {
      "should": [
        {
          "match": {
            "title": "hello world"
          }
        },
        {
          "match": {
            "original_title": "hello world"
          }
        }
      ]
    }
  }
}

"Привет, мир" получит более высокий балл, чем "Привет всем, привет, привет, мир" более короткие поля получают более высокий балл, чем более длинные в эласти c поиск.

...