Я использовал токенизатор n-грамм для создания n-грамм в elasticsearch, но я не могу получить частоту каждого грамма ни биграммы, ни триграммы. Как мне это сделать?
N-граммы с номером частоты с использованием elasticsearch
Ответы (2)
Из вашего вопроса не было ясно, что именно вы пытались сделать. Как правило, хорошей идеей будет опубликовать код, который вы пробовали, и как можно более точное описание вашей проблемы.
Во всяком случае, я думаю, что этот код будет близок к тому, что вы хотите:
http://sense.qbox.io/gist/f357f15360719299ac556e8082afe26e4e0647d1
Я начал с кода в этого ответа, а затем усовершенствовал некоторые с помощью информация в документах для фильтров токенов shangle а>. Вот какое отображение у меня получилось:
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
}
}
}
}
}
Будьте осторожны с использованием векторов терминов в рабочей среде, так как они добавляют некоторые накладные расходы. Зато очень полезно для тестирования.
РЕДАКТИРОВАНИЕ: если вы ищете частотность терминов по всему индексу, просто используйте объединение терминов.