django-elasticsearch-dsl按分数对结果进行排序

时间:2019-05-19 21:00:59

标签: django sorting elasticsearch

我正在尝试对弹性搜索返回的结果进行排序,以使其与用户更加相关。

我有一个大型数据库(超过100M个项目),我需要按名称搜索它们,同时允许出现拼写错误(模糊性为1)。

例如,当我搜索“跳转”时,结果为: -“凹凸” -“凹凸1” -“凹凸2” -... -“跳” -“跳1” -“跳2”

我正在寻找2件东西: -一种显示每场比赛得分的方法 -一种按分数排序结果的方法,以便“跳跃”在“碰撞”之前。

documents / product.py

from django_elasticsearch_dsl import DocType, Index, fields
from elasticsearch_dsl import analyzer
from main.models import Product

product = Index('products')

product.settings(
    number_of_shards=1,
    number_of_replicas=0
)

text_analyzer = analyzer(
    'text_analyzer',
    tokenizer='standard',
    filter=[
        'asciifolding',
        'lowercase',
        'snowball',
        'stop',
    ]
)

@product.doc_type
class ProductDocument(DocType):
    name = fields.TextField(analyzer=text_analyzer)

    class Meta:
        model = Product

        fields = [
            'code',
        ]

    queryset_pagination = 5000

    def prepare_name(self, instance):
        if instance.name:
            return instance.name.replace('-', ' ').replace('_', ' ')
        else:
            return None

search.py​​

from ..documents import ProductDocument
from elasticsearch_dsl import Q

def search(searched_text):

name_options = {
    "query": searched_text,
    "operator": "and",
    "fuzziness": "1",
}

query = Q("match", name=name_options) \
        | Q("match", code=searched_text)

s = ProductDocument.search().filter(query)
s = s[0:1000]

return s.to_queryset()

0 个答案:

没有答案
相关问题