使用弹性搜索的频率数为N-Grams

时间:2015-09-15 18:39:51

标签: elasticsearch stringtokenizer n-gram

我使用n-gram标记生成器在elasticsearch中创建n-gram,但我无法检索每克的频率,无论是二元还是二元语法。我怎么能这样做?

2 个答案:

答案 0 :(得分:0)

您可以使用term vectors

以下是我在另一个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
            }
         }
      }
   }
}

在生产中使用术语向量时要小心,因为它们会增加一些开销。但是对于测试非常有用。

编辑:如果您要在整个索引中查找字词频率,只需使用terms aggregation

答案 1 :(得分:0)

从你的问题中可以清楚地知道你想要做什么。发布您尝试过的代码以及尽可能详细地描述您的问题通常是一个好主意。

无论如何,我认为这段代码将接近你想做的事情:

http://sense.qbox.io/gist/f357f15360719299ac556e8082afe26e4e0647d1

我从this answer中的代码开始,然后使用shingle token filters文档中的信息对其进行了细化。这是我最终得到的映射:

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

同样,在生产中要小心使用术语向量。