Elasticsearch Ngram和查询字符串查询

时间:2015-02-09 17:34:03

标签: indexing elasticsearch lucene n-gram elasticsearch-plugin

我正在使用Elasticsearch 1.2.1。

我正在使用Ngram tokenizer来标记我的文档。我有一个特殊的用例,我的字段可能很长(200-500个字符),我想支持冗长(最多200个字符)"包含"来自该领域任何一点的查询。

我从Ngram分析仪开始,最多有260个字符,并且很快发现索引时间太慢而且容量太大,所以我将大小减小到大约30个字符。

现在,我希望能够将大于30个字符的标记分解为较小的标记,并用破损的标记替换用户搜索(知道如果我使用更大的标记,我可能会获得比我更多的结果Ngram指数)。

实现此功能的推荐方法是什么?请注意,我正在使用查询字符串查询。

1 个答案:

答案 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