我使用的是Elasticsearch 1.2.1。
我正在使用Ngram标记器来标记我的文档。我有一个特殊的用例,其中我的字段可能很长(200-500个字符),我希望支持从字段的任何点进行的长(最多200个字符)"包含"查询。
我从最多260个字符的Ngram分析器开始,很快发现索引时间太慢,容量太大,所以我将大小减少到大约30个字符。
现在,我希望能够将大于30个字符的令牌分解为更小的令牌,并用分解的令牌替换用户搜索(知道如果我使用更大的Ngram索引,我可能会得到更多的结果)。
实现此功能的推荐方法是什么?请注意,我使用的是查询字符串查询。
尝试此处描述的解决方案:在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个字符的字符串),则搜索结果为:
"大ya和大yar和大yard。