我将开始研究Elasticsearch,并拥有一个包含许多带有共享Ngrams术语的小型数据集。
例如,当前Elasticsearch在排名
United Kingdom > Agriculture > Grains > Feed Wheat > Ex-Farm
比
更适合“肉” United Kingdom > Agriculture > Livestock & Meat > Lamb > Deadweight
我相信,如果我可以让ES在其分数中考虑匹配的Ngram的长度,那么这个问题将基本解决。
我花了很多时间来寻找任何提示,但到目前为止没有任何进展。
我已经使用python的elasticsearch-dsl定义了我的Ngram过滤器
ngram_filter = token_filter(
'ngram_filter',
type='ngram',
min_gram=3,
max_gram=10,
)
ngram_analyzer = analyzer(
'ngram_analyzer',
type='custom',
tokenizer='whitespace',
filter=[
'lowercase',
ngram_filter
]
)
答案 0 :(得分:1)
走了一会儿并考虑了一下之后,我决定将NGram分析仪分成不同的字段,并按长度分开。这样,我可以手动提高更长的NGram匹配率。我想我在单个字段上尝试做太多事情。
我不是像这样用django-elasticsearch-dsl以编程方式构建它们。
ngram_analyzers = {
f'{i}ngram': fields.TextField(
analyzer=analyzer(
f'{i}ngram_analyzer',
type='custom',
tokenizer='whitespace',
filter=[
'lowercase',
token_filter(
f'{i}ngram_filter',
type='ngram',
min_gram=i,
max_gram=i
)
]
)
) for i in range(3, 11)
}
ngram_analyzers.update({
'stemmed': fields.TextField(
analyzer='english',
)
})