запрос против фильтра и использование правильного выражения в запросе или фильтре - PullRequest
0 голосов
/ 05 июня 2018

Я видел много вопросов в SO, а также читал документацию о том, что «фильтры кэшируются», в то время как запросы не кэшируются и что «запросы применяются ко всем значениям» и «фильтры применяются после запросов, если они находятся вне запросаобъект "и т. д.

Суть в том, что документация отстой, и DSL очень трудно понять.Я пытаюсь оптимизировать некоторые запросы и использую поисковый профилировщик kibana dev tools, но мои локальные наборы данных должны быть слишком малы, чтобы измерить фактическую разницу в производительности (я получаю результаты в обоих направлениях), и у меня нет тестакластер с несколькими узлами для работы с реальным и большим набором данных.

В этом тривиальном случае все запросы будут возвращать одинаковые результаты.Я хочу понять разницу, и почему вы бы предпочли запрос, а не фильтр в любых случаях, которые позволили бы поместить предложение в фильтр вместо

GET foo11/_search
{
  "query": {
    "bool": {
      "filter": {
        "match" : {
          "in_stock" : true
        }
      }
    }
  }
}

GET foo11/_search
{
  "query": {
    "bool": {
      "filter": {
        "term" : {
          "in_stock" : true
        }
      }
    }
  }
}


GET foo11/_search
{
  "query": {
    "bool": {
      "must": {
        "match" : {
          "in_stock" : true
        }
      }
    }
  }
}

в чем разница в этих 3 случаях вспектакль?Могу ли я на самом деле доказать, что один лучше / хуже другого?

В чем разница между:

"match" : {
  "in_stock" : true
}

против

"term" : {
  "in_stock" : true
}

Ответы [ 2 ]

0 голосов
/ 06 июня 2018

Второй - быстрее

GET foo11/_search
{
  "query": {
    "bool": {
      "filter": {
        "term" : {
          "in_stock" : true
        }
      }
    }
  }
}

Причина, по которой он быстрее: - Фильтр не выполняет оценку для ваших документов.- Термин будет соответствовать точному слову, пропустите часть анализа.

Дополнительная информация: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-term-query.html

0 голосов
/ 05 июня 2018

Есть несколько разных вопросов и концепций, которые нужно распаковать.

Совпадение с термином

A match запрос выполняет анализ (удаление общих стоп-слов, использование ствола для удаления завершающего "ing", "es"и т. д.) перед указанием значений поиска, прежде чем искать их в индексе.Цель анализа - сделать так, чтобы слова, которые означают примерно одно и то же, совпадали, например, если вы ищете «бананы», но вы проиндексировали «банан», он все равно найдет его.Стоит отметить, что для того, чтобы это работало, анализ также должен выполняться на поле при индексации данных, что и делает поле типа text в Elasticsearch.

A term запрос является точнымсовпадать без анализа.Это больше похоже на то, к чему вы привыкли в реляционной базе данных.Они предварительно сформированы для полей keyword и других полей типа данных (числовые, логические, даты).Если вам нужно сопоставить оба пути, вы можете проиндексировать поле, используя оба типа.

Запрос против фильтра

A query вasticsearch - это серия условий поискаэто будет оцениваться и ранжироваться друг против друга на основе их актуальности.Другими словами, основываясь на словах, которые вы просили меня найти, какие документы кажутся наиболее релевантными.

A filter вasticsearch ограничивает набор записей, для которых выполняется запрос, и не оценивает преформу.Вы можете думать об этом как о первом проходе, который определяет, какие записи следует проверять перед выполнением более дорогих вычислений, чтобы определить, насколько релевантны ваши условия поиска для каждого документа.

Другое важное различие, которое вы упомянули, - filters кэшируются, но queries нет.Обычно, если у вас есть широкие условия, которые вы хотите применить, вы можете сделать эти фильтры и сделать часть поиска "человеческим текстом" запросом.Вообще говоря, если у вас есть широкие ограничения, вы можете сделать это, чтобы ограничить доступный для поиска набор документов, вы можете поместить его в фильтр, чтобы воспользоваться преимуществами кэширования и экономии времени, избегая скоринга.Например, что-то вроде: отфильтруйте только продукты в кулинарных книгах, затем запросите заголовки со словом «бананы».

Измерения производительности

Измерение производительности запроса может быть затруднено, посколькув миксе много движущихся частей.Наилучший подход, если у вас есть время, - это индексировать репрезентативный (и несколько большой) объем данных на одном узле, а затем выполнить первоначальное тестирование с этим до масштабирования.Возможно, вы захотите взглянуть на инструмент Elasticsearch для тестирования производительности, который называется Rally.

https://github.com/elastic/rally

Собираем все вместе

Для вашего примеравыше, так как поле, которое вы ищете, является логическим, вам нужно выполнить запрос term, а не match.Кроме того, вы можете сделать это в предложении filter, потому что нет никакой оценки релевантности для единственного логического значения.Если вы хотите объединить его с другим текстовым поиском, вы можете добавить предложение соответствия в контексте query к своему телу json.

...