带有 edgeNgram 过滤器的自定义分析器不起作用

Custom analyzer with edgeNgram filter doesn't work

我需要在我的网站中进行部分搜索。最初我直接使用 edgeNgramFeild 它没有按预期工作。所以我使用自定义搜索引擎 analyzers.I 我正在使用 Django-haystack。

'settings': {
       "analysis": {
           "analyzer": {
               "ngram_analyzer": {
                   "type": "custom",
                   "tokenizer": "lowercase",
                   "filter": ["haystack_ngram"]
               },
               "edgengram_analyzer": {
                   "type": "custom",
                   "tokenizer": "lowercase",
                   "filter": ["haystack_edgengram"]
               },
               "suggest_analyzer": {
                   "type":"custom",
                   "tokenizer":"standard",
                   "filter":[
                       "standard",
                       "lowercase",
                       "asciifolding"
                   ]
               },
           },
           "tokenizer": {
               "haystack_ngram_tokenizer": {
                   "type": "nGram",
                   "min_gram": 3,
                   "max_gram": 15,
               },
               "haystack_edgengram_tokenizer": {
                   "type": "edgeNGram",
                   "min_gram": 2,
                   "max_gram": 15,
                   "side": "front"
               }
           },
           "filter": {
               "haystack_ngram": {
                   "type": "nGram",
                   "min_gram": 3,
                   "max_gram": 15
               },
               "haystack_edgengram": {
                   "type": "edgeNGram",
                   "min_gram": 2,
                   "max_gram": 15
               }
           }
       }
   } 

使用 edgengram_analyzer 进行索引,suggest_analyzer 进行搜索。这在一定程度上起到了作用。但是,它不适用于数字,例如,当输入 30 时,它不会搜索 303 以及包含字母和数字组合的单词。所以我搜索了各种网站。

他们建议使用标准或 whitespace 分词器和 haystack_edgengram 过滤器。但它根本不起作用,搁置数字部分搜索甚至对字母表也不起作用。建议后的设置:

'settings': {
        "analysis": {
            "analyzer": {
                "ngram_analyzer": {
                    "type": "custom",
                    "tokenizer": "lowercase",
                    "filter": ["haystack_ngram"]
                },
                "edgengram_analyzer": {
                    "type": "custom",
                    "tokenizer": "whitepsace",
                    "filter": ["haystack_edgengram"]
                },
                "suggest_analyzer": {
                    "type":"custom",
                    "tokenizer":"standard",
                    "filter":[
                        "standard",
                        "lowercase",
                        "asciifolding"
                    ]
                },
            },
            "filter": {
                "haystack_ngram": {
                    "type": "nGram",
                    "min_gram": 3,
                    "max_gram": 15
                },
                "haystack_edgengram": {
                    "type": "edgeNGram",
                    "min_gram": 2,
                    "max_gram": 15
                }
            }
        }
    } 

lowercase 分词器外,其他任何东西都可以与 django-haystack 一起使用吗?或 haystack_edgengram 过滤器对我不起作用。据我所知,它应该像这样工作。将 2 Lazy Dog 视为提供的文本。它应该通过 whitespace [2,Lazy,Dog] 获得这样的标记。然后应用 haystack_edgengram 过滤器,它应该生成令牌 [2,la,laz,lazy,do,dog]。它不像 this.Did 那样工作,我做错了什么?

我的要求是例如文本 2 Lazy Dog 当某些人输入 2 Laz 它应该工作时。

已编辑:

根据我的假设,小写分词器工作正常。但是,在上述文本的情况下,它将省略 2 并创建令牌 [lazy,dog]。为什么标准或空白分词器无法工作?

在 ngrams 过滤器中,您定义 min_gram 这是创建的标记的最小长度。在您的情况下,“2”的长度为:1,因此在 ngram 过滤器中会被忽略。

解决此问题的最简单方法是将 min_gram 更改为 1。稍微复杂一点的方法是结合一些标准分析器来匹配整个关键字(对较短的术语有用)和 ngram 分析器来进行部分匹配(对于长期而言)- 可能有一些 bool 查询。

您也可以将 ngram 更改为从“1”个字符开始,但在将查询发送到 Elasticsearch 之前,在您的搜索框中至少需要 3 个字母。

根据@jgr 的建议,我自己找到了答案:

ELASTICSEARCH_INDEX_SETTINGS = {
    "settings": {
        "analysis": {
            "analyzer": {
                "ngram_analyzer": {
                    "type": "custom",
                    "tokenizer": "standard",
                    "filter": ["haystack_ngram"]
                },
                "edgengram_analyzer": {
                    "type": "custom",
                    "tokenizer": "standard",
                    "filter": ["haystack_edgengram","lowercase"]
                },
                "suggest_analyzer": {
                    "type":"custom",
                    "tokenizer":"standard",
                    "filter":[
                        "lowercase"
                    ]

                }
            },
            "filter": {
                "haystack_ngram": {
                    "type": "nGram",
                    "min_gram": 1,
                    "max_gram": 15
                },
                "haystack_edgengram": {
                    "type": "edgeNGram",
                    "min_gram": 1,
                    "max_gram": 15
                }
            }
        }
    }
}

ELASTICSEARCH_DEFAULT_ANALYZER = "suggest_analyzer"