【发布时间】:2018-04-07 12:54:14
【问题描述】:
我需要在我的网站中进行部分搜索。最初我直接使用了 edgeNgramFeild,它没有按预期工作。所以我使用自定义搜索引擎和自定义分析器。我使用的是 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 tokenizer 之外的任何东西都可以与 django-haystack 一起使用吗?或haystack_edgengram 过滤器对我不起作用。据我所知,它应该像这样工作。将2 Lazy Dog 视为提供的文本。它应该使用whitespace [2,Lazy,Dog] 获得这样的令牌。然后应用haystack_edgengram 过滤器,它应该会生成令牌[2,la,laz,lazy,do,dog]。它不能像这样工作。我做错了什么吗?
我的要求是例如文本2 Lazy Dog,当某些类型2 Laz 应该可以工作时。
已编辑:
在我的假设中,小写分词器工作正常。但是,在上述文本的情况下,它将省略 2 并创建令牌 [lazy,dog]。为什么标准或空白分词器不能工作?
【问题讨论】:
标签: python django elasticsearch django-haystack