带有 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"
我需要在我的网站中进行部分搜索。最初我直接使用 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"