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