我使用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:如果您正在查找整个索引的术语频率,只需使用术语聚合。