N-грамм с частотным числом с использованием упругого поиска
Я использовал токенайзер n-грамм для создания n-грамм в эластичном поиске, но я не могу получить частоту каждого грамм, будь то биграмм или триграмм. Как мне это сделать?
2 ответа
Из твоего вопроса не было ясно, что именно ты пытался сделать. Обычно рекомендуется опубликовать код, который вы пробовали, и как можно более конкретное описание вашей проблемы.
В любом случае, я думаю, что этот код будет близок к выполнению того, что вы хотите:
http://sense.qbox.io/gist/f357f15360719299ac556e8082afe26e4e0647d1
Я начал с кода в этом ответе, а затем уточнил некоторые из них, используя информацию в документах для фильтров жетонов. Вот карта, с которой я закончил:
PUT /test_index
{
"settings": {
"analysis": {
"analyzer": {
"evolutionAnalyzer": {
"tokenizer": "standard",
"filter": [
"standard",
"lowercase",
"custom_shingle"
]
}
},
"filter": {
"custom_shingle": {
"type": "shingle",
"min_shingle_size": "2",
"max_shingle_size": "3",
"filler_token": "",
"output_unigrams": true
}
}
}
},
"mappings": {
"doc": {
"properties": {
"content": {
"type": "string",
"index_analyzer": "evolutionAnalyzer",
"search_analyzer": "standard",
"term_vector": "yes"
}
}
}
}
}
Опять же, будьте осторожны, используя термин векторов в производстве.
Вы можете использовать термин векторов.
Вот некоторый код, где я использовал векторы терминов в другом ответе SO:
http://sense.qbox.io/gist/3092992993e0328f7c4ee80e768dd508a0bc053f
В качестве быстрого примера, если я настрою индекс, предназначенный для автозаполнения, следующим образом:
PUT /test_index
{
"settings": {
"analysis": {
"analyzer": {
"autocomplete": {
"type": "custom",
"tokenizer": "standard",
"filter": [
"standard",
"stop",
"kstem",
"edgengram_filter"
]
}
},
"filter": {
"edgengram_filter": {
"type": "edgeNGram",
"min_gram": 2,
"max_gram": 15
}
}
}
},
"mappings": {
"doc": {
"properties": {
"content": {
"type": "string",
"index_analyzer": "autocomplete",
"search_analyzer": "standard",
"term_vector": "yes"
}
}
}
}
}
Затем добавьте пару простых документов:
POST test_index/doc/_bulk
{"index":{"_id":1}}
{"content":"hello world"}
{"index":{"_id":2}}
{"content":"goodbye world"}
Я могу посмотреть на частоту термина для одного документа, как это:
GET /test_index/doc/1/_termvector
который возвращает:
{
"_index": "test_index",
"_type": "doc",
"_id": "1",
"_version": 1,
"found": true,
"took": 1,
"term_vectors": {
"content": {
"field_statistics": {
"sum_doc_freq": 8,
"doc_count": 1,
"sum_ttf": 8
},
"terms": {
"he": {
"term_freq": 1
},
"hel": {
"term_freq": 1
},
"hell": {
"term_freq": 1
},
"hello": {
"term_freq": 1
},
"wo": {
"term_freq": 1
},
"wor": {
"term_freq": 1
},
"worl": {
"term_freq": 1
},
"world": {
"term_freq": 1
}
}
}
}
}
Будьте осторожны при использовании векторов терминов в производстве, так как они добавляют некоторые накладные расходы. Очень полезно для тестирования, хотя.
РЕДАКТИРОВАТЬ: Если вы ищете частоту терминов по всему индексу, просто используйте агрегирование терминов.