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



我使用n-grams标记器在elasticsearch中创建n-gram,但是我无法检索每个gram的频率,无论是双gram还是三gram。我怎么能做到呢?

从你的问题中不清楚你到底想做什么。一般来说,把你试过的代码贴出来是个好主意,并尽可能详细地描述你的问题。

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

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

在生产中小心使用术语向量,因为它们确实增加了一些开销。对于测试来说非常有用。

EDIT:如果您正在查找整个索引的术语频率,只需使用术语聚合。

相关内容

  • 没有找到相关文章

最新更新