如何通过匹配长度提高NGrams的排名

2024-09-28 19:29:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我开始使用Elasticsearch,并拥有一个小数据集,其中包含许多共享Ngrams的术语

例如,目前Elasticsearch正在排名

United Kingdom > Agriculture > Grains > Feed Wheat > Ex-Farm

作为“肉”的更好搭配,而不是

United Kingdom > Agriculture > Livestock & Meat > Lamb > Deadweight

我相信如果我能把匹配的NGRAM的长度考虑到它的分数中,那么这个问题大部分会自行解决。p>

我花了很多时间在谷歌上搜索任何提示,但到目前为止还没有任何结果

我已经使用python的ElasticSearchDSL定义了我的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
    ]
)

Tags: 数据feedtypefilterelasticsearchanalyzerunitedkingdom
1条回答
网友
1楼 · 发布于 2024-09-28 19:29:53

在离开一段时间并思考之后,我决定将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',
            )
        })

相关问题 更多 >