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

时间:2019-06-03 14:13:02

标签: python elasticsearch

我将开始研究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
    ]
)

1 个答案:

答案 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',
            )
        })