gpt4 book ai didi

python - Django DRF Elasticsearch dsl,基于另一个字段数值应用功能提升

转载 作者:行者123 更新时间:2023-12-04 07:50:28 26 4
gpt4 key购买 nike

我正在尝试根据另一个字段数值(该字段在另一个模型中)来调整我的字段搜索结果的相关性。看着ES documentation似乎功能提升是我的用例所需要的。
请注意,我使用的是 django-elasticsearch-dsl ;包裹。
我的用例:

  • 我有一个搜索字段,用户可以在其中根据公司名称搜索公司。
  • 我想返回与查询匹配的公司名称,其中排序(相关性)取决于公司的净 Assets ,其中数字越大,相关性越高(另一个模型中的字段)

  • 型号定义:
    class Company(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255, blank=False, null=False)

    def __str__(self):
    return self.name

    class CompanyNetAsset(models.Model):
    id = models.AutoField(primary_key=True)
    assets = models.IntegerField
    company_id = models.ForeignKey('Company', on_delete=models.PROTECT, blank=True, null=True)

    def __str__(self):
    return self.name
    我的es文件:
    ...
    custom_stop_words = token_filter(
    'custom_stopwords',
    type='stop',
    ignore_case=True,
    stopwords=['the', 'and']

    )


    html_strip = analyzer(
    'html_strip',
    tokenizer="standard",
    filter=["lowercase", "asciifolding", custom_stop_words],
    char_filter=["html_strip"],
    )


    @INDEX.doc_type
    class CompanyDocument(Document):
    id = fields.IntegerField(attr='id')

    name = fields.TextField(
    analyzer=html_strip,
    fields={
    'raw': fields.TextField(analyzer='keyword'),
    }
    )

    class Django:
    model = Company
    这是 DocumentViewSet:
    class CompanyDocumentViewSet(DocumentViewSet):
    """The Company Document view."""
    serializer_class = CompanyDocumentSerializer
    lookup_field = 'id'
    document = CompanyDocument
    filter_backends = [
    FilteringFilterBackend,
    SearchFilterBackend,
    ]
    search_fields = (
    'name'
    )

    filter_fields = {
    'id': None,
    'name': 'name.raw',

    }
    知道如何使用 drf ES 包实现这一目标吗?
    更新
    这是一个示例查询:
     /api/v1/employers/companies/?search=name:foundation%20center

    "results": [
    {
    "id": 469329,
    "name": "THE FOUNDATION CENTER",
    "city": "NEW YORK",
    "state": "NY"
    },
    {
    "id": 323012,
    "name": "OVERTURE CENTER FOUNDATION",
    "city": "MADISON",
    "state": "WI"
    },
    {
    "id": 367286,
    "name": "PEACE CENTER FOUNDATION",
    "city": "GREENVILLE",
    "state": "SC"
    },
    ...
    这是文档的子输出:
    {'settings': {'number_of_shards': 1,
    'number_of_replicas': 1,
    'analysis': {'analyzer': {'html_strip': {'tokenizer': 'standard',
    'filter': ['lowercase', 'asciifolding', 'custom_stopwords'],
    'char_filter': ['html_strip'],
    'type': 'custom'}},
    'filter': {'custom_stopwords': {'ignore_case': True,
    'stopwords': ['the', 'and'],
    'type': 'stop'}}}},
    'mappings': {'properties': {'id': {'type': 'integer'},
    'city': {'type': 'text'},
    'state': {'type': 'text'},
    'name': {'analyzer': 'html_strip',
    'fields': {'raw': {'analyzer': 'keyword', 'type': 'text'}},
    'type': 'text'}}}}

    最佳答案

    ES 不支持查询时连接,因此您需要复制 CompanyNetAsset Company 中的属性模型能够让assets影响你的排序。
    实际上,调整Company模型如下:

    class Company(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=255, blank=False, null=False)
    assets = models.IntegerField

    def __str__(self):
    return self.name
    然后调整 Document :
    @INDEX.doc_type
    class CompanyDocument(Document):
    id = fields.IntegerField(attr='id')

    name = fields.TextField(
    analyzer=html_strip,
    fields={
    'raw': fields.TextField(analyzer='keyword'),
    }
    )

    assets = fields.IntegerField(attr='assets')

    class Django:
    model = Company
    最后,重新索引您的文档并定义排序:
    class CompanyDocumentViewSet(DocumentViewSet):
    """The Company Document view."""
    serializer_class = CompanyDocumentSerializer
    lookup_field = 'id'
    document = CompanyDocument
    filter_backends = [
    FilteringFilterBackend,
    SearchFilterBackend,
    ]
    search_fields = (
    'name'
    )

    filter_fields = {
    'id': None,
    'name': 'name.raw',

    }

    # Define ordering fields # <--
    ordering_fields = {
    'assets': None
    }

    # Specify default ordering
    ordering = ('assets')
    强制执行 sort order via the URI , 跑:
    GET /api/v1/employers/companies/?search=name:foundation%20center&ordering=-assets

    关于python - Django DRF Elasticsearch dsl,基于另一个字段数值应用功能提升,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67013173/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com