elasticsearch,django-haystack,Python,Django,elasticsearch,Django Haystack" /> elasticsearch,django-haystack,Python,Django,elasticsearch,Django Haystack" />

Python 带有edgeNgram过滤器的定制分析仪不';行不通

Python 带有edgeNgram过滤器的定制分析仪不';行不通,python,django,elasticsearch,django-haystack,Python,Django,elasticsearch,Django Haystack,我需要在我的网站上进行部分搜索。起初,我直接使用Edgengramfield,但效果并不理想。所以我使用了带有自定义分析器的自定义搜索引擎。我使用的是Django haystack 'settings': { "analysis": { "analyzer": { "ngram_analyzer": { "type": "custom", "tokeniz

我需要在我的网站上进行部分搜索。起初,我直接使用Edgengramfield,但效果并不理想。所以我使用了带有自定义分析器的自定义搜索引擎。我使用的是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\u analyzer
,用于搜索的
suggest\u analyzer
。这在一定程度上起了作用。但是,它不适用于数字,例如,当输入30时,它不搜索303,也不搜索包含字母和数字组合的单词。所以我搜索了各种网站

他们建议使用标准或
whitespace
tokenizer和
haystack\u edgengram
filter。但它根本不起作用,把数字放在一边,部分搜索甚至对字母表也不起作用。建议后的设置:

'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
                }
            }
        }
    } 
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"
除了
小写
标记器之外,还有其他东西可以与django haystack一起使用吗?或者
haystack\u edengram
过滤器不适合我。据我所知,它应该是这样工作的。将
2条懒狗
视为提供的文本。它应该用
空格
[2,Lazy,Dog]
获得这样的令牌。然后应用haystack_edgengram
过滤器,它应该生成令牌
[2,la,laz,lazy,do,dog]
。它不是这样工作的。我做错什么了吗

例如,我的要求是,当有人键入
2 Laz
时,文本
2 Lazy Dog
应该可以工作

编辑:


在我看来,小写标记器工作正常。但是,在上述文本的情况下,它将省略
2
,并创建令牌
[lazy,dog]
。为什么标准或空白标记器不能工作?

在ngrams过滤器中,您定义了最小值,它是所创建标记的最小长度。在您的示例中,“2”的长度为:1,因此在ngram筛选器中忽略该长度

解决此问题的最简单方法是将min_gram更改为1。更复杂一点的方法是结合一些标准分析器来匹配整个关键字(对较短的术语有用)和ngram analyzer来进行部分匹配(对较长的术语有用)——可能还需要一些布尔查询


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

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

'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
                }
            }
        }
    } 
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"

请将问题的解决归功于@jgr,而不是你自己