2015-02-09 207 views
1

我正在使用Elasticsearch 1.2.1。Elasticsearch Ngram和查询字符串查询

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

我开始使用Ngram分析器,最多可以处理260个字符,并且很快发现索引时间太慢,容量太大,所以我将它缩小到30个字节左右。

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

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

回答

1

尝试用在这里描述的解决方案: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个字符长n元语法用于(配置有:“max_gram “:8)。要搜索超过8个字符的字词,请将搜索转换为布尔AND查询,以查找该字符串中每个不同的8字符子字符串。例如,如果用户搜索大院子(10个字符的字符串),搜索将是:

“ARGE雅与ARGE亚尔和RGE码