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
            }
         }
      }
   }
}

Будьте осторожны при использовании векторов терминов в производстве, так как они добавляют некоторые накладные расходы. Очень полезно для тестирования, хотя.

РЕДАКТИРОВАТЬ: Если вы ищете частоту терминов по всему индексу, просто используйте агрегирование терминов.

Другие вопросы по тегам