我正在使用Elasticsearch 1.2.1。
我正在使用Ngram tokenizer来标记我的文档。我有一个特殊的用例,我的字段可能很长(200-500个字符),我想支持冗长(最多200个字符)"包含"来自该领域任何一点的查询。
我从Ngram分析仪开始,最多有260个字符,并且很快发现索引时间太慢而且容量太大,所以我将大小减小到大约30个字符。
现在,我希望能够将大于30个字符的标记分解为较小的标记,并用破损的标记替换用户搜索(知道如果我使用更大的标记,我可能会获得比我更多的结果Ngram指数)。
实现此功能的推荐方法是什么?请注意,我正在使用查询字符串查询。
答案 0 :(得分:2)
尝试使用此处描述的解决方案:Exact Substring Searches in ElasticSearch
{
"mappings": {
"my_type": {
"index_analyzer":"index_ngram",
"search_analyzer":"search_ngram"
}
},
"settings": {
"analysis": {
"filter": {
"ngram_filter": {
"type": "ngram",
"min_gram": 3,
"max_gram": 8
}
},
"analyzer": {
"index_ngram": {
"type": "custom",
"tokenizer": "keyword",
"filter": [ "ngram_filter", "lowercase" ]
},
"search_ngram": {
"type": "custom",
"tokenizer": "keyword",
"filter": "lowercase"
}
}
}
}
}
要解决磁盘使用问题和太长的搜索词问题,请使用短8个字符 ngrams (配置为:" max_gram":8 )。要搜索超过8个字符的术语,请将搜索转换为布尔AND查询,以查找该字符串中每个不同的8个字符的子字符串。例如,如果用户搜索大码(10个字符的字符串),则搜索将为:
" arge ya and arge yar and rge yard 。