2016-07-16 3 views
0

Предположим, мы выполняем два запроса, как показано ниже на нашем Индексе Доступные вакансии Работа:Elasticsearch - Как угадать важные слова в запросах?

  • PHP Developer
  • рубин Разработчик

При выполнении простых логических И позиции запроса, как PHP Programmer будет исключен из-за отсутствия присутствия для разработчик. при выполнении ИЛИ boolean query for PHP-разработчик документы, содержащие Разработчик Ruby также будет включен в результаты.

Что является лучшим способом обнаружить, что в фразу PHP Developer, PHP является более важным, чем Developer?

Так при выполнении поиска с PHP DeveloperPHP термин MUST появляются в результате, но Developer раздел будет только увеличить счет.

ответ

2

Вы можете использовать обычный «матч» запрос и добавить параметр «cutoff_frequency». как:

{ 
    "query": { 
      "match": { 
       "<field_name>": { 
         "query": "PHP Developer", 
         "operator": "AND", 
         "cutoff_frequency": 0.001 
       }     
      } 
    } 
} 

Таким образом, каждый термин, который appers в менее чем 0,1% документов - будет считаться «важным» и будет «должен» в то время как другие условия не будут «должны», но только увеличивайте счет. «Разработчик» будет более распространенным, чем «PHP», так что «PHP» будет обязательным, но «Разработчик» будет необязательным, но оценен выше. Обратите внимание, что «PHP» может быть довольно распространенным, поэтому вам нужно тонкой настройки правильной частоты!

+0

Спасибо, трюк здесь - правильно настроить «cuttoff», но он все еще в порядке, потому что тогда он получит больше очков. –

+0

Можно ли сделать токен с меньшей частотой a * MUST * независимо от частоты одного токена, но токен с меньшей частотой будет * MUST *? –

1

Не думаю, что есть простой ответ. В зависимости от количества таких терминов, как разработчик, вы можете сделать что-то вроде запроса Boosting. Вам придется отфильтровать условия из вашего поискового запроса и создать запрос Boosting.

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-boosting-query.html

Лучший подход может заключаться в использовании общих терминов запроса. Здесь вы можете дать термины, которые во многих документах, «высокочастотные» термины, менее важны. Использование low_freq_operator с помощью AND может помочь вам с тем, что вы хотите выполнить.

https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-common-terms-query.html

0

Вы можете использовать пользовательский анализатор для поля, чтобы маркеры поля всегда были согласованы. В этом случае вы можете использовать фильтр-токен типа «стоп» (фильтр стоп-слов) с «Разработчиком» в списке стоп-слов (и все, что должно быть эффективно проигнорировано). Это будет применяться как к запросу, так и к данным при индексировании, поэтому, если у вас есть «PHP Developer» в индексе и «PHP» в запросе, они оба будут превращены в токен «PHP», поэтому они будут точное совпадение.

Чтобы сделать это более надежным для разных способов ввода «Разработчика», вы, вероятно, захотите также использовать «строчный» токен-фильтр, поэтому вместо этого вместо этого будет «разработчик».

Следует отметить, что для этого потребуется переиндексировать данные.

Файл настроек будет в конечном итоге что-то вроде этого:

{ 
    "analysis": { 
    "filter": { 
     "job_stopwords": { 
      "type": "stop", 
      "stopwords": [ 
       "developer", "dev" 
      ] 
     } 
    }, 
    "analyzer": { 
     "job_analyzer": { 
      "type": "custom", 
      "filter": [ 
       "lowercase", "job_stopwords" 
      ] 
     } 
    } 
} 

Тогда вам нужно применить анализатор job_analyzer к области работы в отображении для вашего документа.

Чтобы «Разработчик» увеличил оценку попадания, вы можете добавить под-поле для сопоставления для поля, которое использует анализатор по умолчанию. Тогда вы могли бы «потребовать» job_analyzer и «должны» анализируемую версию по умолчанию.

Ваши отображения будет выглядеть примерно так:

{ 
    "job_posting": { 
     "properties": { 
      "job_type": { 
       "type": "string", 
       "analyzer": "job_analyzer", 
       "fields": { 
        "default": { 
         "type": "string" 
        } 
       } 
      } 
     } 
    } 
} 

Ваш запрос будет тогда быть что-то вроде этого:

{ 
    "query": { 
     { 
      "bool": { 
      "must": { 
       "match": { 
         "job_type" : "PHP Developer" 
       } 
      }, 
      "should": { 
       "match": { 
         "job_type.default" : "PHP Developer" 
       } 
      } 
      } 
     } 
    } 
} 

который будет соответствовать "PHP Developer", "PHP Dev" и «PHP », но« PHP Developer »получит самый высокий балл.

Смежные вопросы