2016-09-07 2 views
2

У меня есть около 15 000 очищенных сайтов с текстом их тела, хранящихся в индексе эластичного поиска. Мне нужно, чтобы получить 100 наиболее часто используемые фразы трех слов используется во всех этих текстах:Получить 100 самых используемых трех словосочетаний во всех документах

Что-то вроде этого:

Hello there sir: 203 
Big bad pony: 92 
First come first: 56 
[...] 

Я новичок в этом. Я просмотрел векторы сроков, но они, похоже, применимы к отдельным документам. Поэтому я считаю, что это будет комбинация терминальных векторов и агрегации с n-граммовым анализом. Но я не знаю, как это реализовать. Любые указатели будут полезны.

Мое текущее отображение и настройки:

{ 
    "mappings": { 
    "items": { 
     "properties": { 
     "body": { 
      "type": "string", 
      "term_vector": "with_positions_offsets_payloads", 
      "store" : true, 
      "analyzer" : "fulltext_analyzer" 
     } 
     } 
    } 
    }, 
    "settings" : { 
    "index" : { 
     "number_of_shards" : 1, 
     "number_of_replicas" : 0 
    }, 
    "analysis": { 
     "analyzer": { 
     "fulltext_analyzer": { 
      "type": "custom", 
      "tokenizer": "whitespace", 
      "filter": [ 
      "lowercase", 
      "type_as_payload" 
      ] 
     } 
     } 
    } 
    } 
} 

ответ

2

Что вы ищете называется черепицу. Осадки чередуются, как «word n-grams»: последовательные комбинации из более чем одного члена в строке. (Например, «все мы живем», «все живут в», «жить в», «в желтый», «желтая подводная лодка»)

Посмотрите здесь: https://www.elastic.co/blog/searching-with-shingles

В принципе, вам нужно поле с анализатором гальки производить исключительно 3-термин черепицу:

Elastic конфигурацию записи блога, но с:

"filter_shingle":{ 
    "type":"shingle", 
    "max_shingle_size":3, 
    "min_shingle_size":3, 
    "output_unigrams":"false" 
} 

, после применения анализатора гальки в рассматриваемой области (как в сообщение блога) и , переиндексируя ваши данные, вы должны будете отправить запрос, возвращающий простой terms aggregation, в поле body, чтобы увидеть верхнюю сотню фраз из трех слов.

{ 
    "size" : 0, 
    "query" : { 
    "match_all" : {} 
    }, 
    "aggs" : { 
    "three-word-phrases" : { 
     "terms" : { 
     "field" : "body", 
     "size" : 100 
     } 
    } 
    } 
} 
+0

Это прекрасно работает! Спасибо, Питер! – HyderA

+0

Только один вопрос, как мне сделать несколько фраз с одним полем. Например, слова с двумя словами, фразы с четырьмя словами и т. Д.? Мне нужно создать индекс для каждого анализатора? – HyderA

+0

Вид. Создайте отдельные поля с отдельными анализаторами и просто скопируйте содержимое тела всем им. Затем вы можете выполнить грань на каждом специально построенном гальке. –

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