【问题标题】:Elasticsearch Ngram and Query String QueryElasticsearch Ngram 和查询字符串查询
【发布时间】:2015-04-09 13:06:39
【问题描述】:

我使用的是 Elasticsearch 1.2.1。

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

我从最多 260 个字符的 Ngram 分析器开始,很快发现索引时间太慢且容量太大,因此我将大小减小到大约 30 个字符。

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

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

【问题讨论】:

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


    【解决方案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 个字符长的 ngrams(配置为:"max_gram": 8)。要搜索超过 8 个字符的术语,请将搜索转换为布尔 AND 查询,查找该字符串中每个不同的 8 个字符子字符串。例如,如果用户搜索 large yard(一个 10 个字符的字符串),则搜索将是:

    "arge ya AND arge yar AND rge yard.

    【讨论】:

      猜你喜欢
      • 2021-05-24
      • 1970-01-01
      • 2014-12-09
      • 2017-03-28
      • 2017-07-08
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多