2013-11-22 4 views
1

Я как бы новый для Elasticsearch. Я хранить много ключевых слов внутри Elasticsearch, что-то вродеElasticsearch Поиск по ключевой фразе Внутри A Более крупный текст

{"text": "harry potter", "added": "2013-11-10"} 
{"text": "prisoner of azkaban", "added": "2013-11-10"} 
... 

То, что я хочу сделать это, учитывая больший текст, найти все ключевые слова, которые встречаются в этой строке.

Например, для строки harry potter and the prisoner of azkaban, я, скорее всего, рассчитывать на harry potter и prisoner of azkaban оставив and the как остаток.

Мой алгоритм

1. search the keyword with the best score for the input 
2. if found, remove the keyword inside the input. otherwise exit. 
3. go back to step 1 and use the remainder as the input. 

Я первоначально использовать этот запрос

{ 
    "query": { 
     "match": { 
      "text": "harry potter and prisoner of azkaban" 
     } 
    } 
} 

Это, скорее всего, возвращение prisoner of azkaban в первом проходе и harry potter после этого.

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

Например, в одном случае есть ключевое слово prisoner harry potter. Когда я пытаюсь выполнить запрос с использованием harry potter and prisoner of azkaban, это ключевое слово имеет (давайте предположим для примера) лучший результат, чем harry potter и prisoner of azkaban, но я не могу удалить ключевое слово внутри ввода из-за заказа.

Ну, я могу изменить алгоритм

1. search the 5 keywords with the best score for the input 
2. for each keywords check against the input, 
     if a keyword inside the input remove it from the input. 
3. if at least one keyword is inside the input go back to step 1 
     and use the remainder as the new input otherwise exit. 

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

.. или, может быть, Elasticsearch не подходит для этого?

ответ

2

Вы можете использовать shingle indexing, затем выполнить поиск по одному запросу за один раз, без использования каких-либо алгоритмов.

Газонокосилка-анализатор в основном разделяет ваш текст на термины и термины.

Text : I love apple 
Terms: I, love, apple, I love, love apple, I love apple 

Использование следующего запроса для соответствия всем документам.

{ 
    "query": { 
     "match": { 
      "text": "harry potter and prisoner of azkaban" 
     } 
    } 
} 

Also here an answer to my question about shingle analyzer.

+0

спасибо за ответ. Я просто попробовал здесь https://gist.github.com/petrabarus/f7cc8c6df312a69cf701. но результат все еще возвращает что-то вроде «Гарри и гончар», «заключенный Гарри Поттер». я надеялся, что что-то вроде «Гарри Поттер» и «Узник азкабана» получит лучший результат. –

+0

получается, мне нужно изменить 'index_analyzer' на' keyword', и он работает так же, как и я. –

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