【问题标题】:Problem with elasticsearch queries like Q, term and terms弹性搜索查询问题,如 Q、术语和术语
【发布时间】:2021-07-25 07:17:35
【问题描述】:
client = Elasticsearch()
s = Search(using=client,index="myntra_clothes")

fts_query = MultiMatch(query=data['text'], fields=['Title', 'Description'], operator="AND", fuzziness='AUTO')
s = s.query(fts_query)
s = s.filter('match', SubCategory3='Jeans')
result = s.execute()

虽然上述工作正常, 以下是我尝试过的列表,但不起作用:

s = s.filter('terms', Colour['Blue','Black'])

q = Q('term', Category='Men') &  Q('term', SubCategory3='Jeans')
s = s.query(q)

es_query = []
es_query.append(Q("match", Category="Male"))
es_query.append(Q("match",SubCategory3="Jeans"))
final_query = Q("bool", must=es_query)
s = s.query(final_query)

这些查询执行时不会抛出任何错误,只是返回一个空白响应。

更新: 我正在使用 Django 框架,下面是我的映射:

@registry.register_document
class MyntraClothesDocument(Document):

class Index:
    # Name of the Elasticsearch index
    name = 'myntra_clothes'
    settings = {'number_of_shards': 1,
                'number_of_replicas': 0}

class Django:
    # The Django model associated with this Document
    model = MyntraClothes 

    # The fields of the model you want to be indexed in Elasticsearch
    fields = ['SubCategory3','Category','Colour','Title','Description']

【问题讨论】:

    标签: python elasticsearch elasticsearch-dsl


    【解决方案1】:

    在第二个查询中,您使用的是termterms query这两个查询都适用于完全匹配

    term/terms 查询不会对搜索词应用任何分析器,因此只会在倒排索引中查找确切的词。

    要搜索确切的术语,您需要使用 Category.keyword 字段或更改字段的映射。如果索引中存在"Blue" OR "Black" 术语,则搜索结果将出现。

    而在第一个查询中,您使用match query,它在执行搜索查询时分析文本(如果未指定分析器,则使用standard analyzer),因此您在第一个查询中获得搜索结果。

    【讨论】:

    • q2 = Q("terms", Colour.keyword=['Blue','Black']) ,试过这个,但给出的关键字不能是表达式。请你能用一个例子解释一下吗?另外,如何在索引中映射相同的
    • @Sachin 你定义了任何明确的索引映射吗?
    • 是的,我映射了我用于从数据库中搜索的字段,上面的字段就是这样映射的。
    • @Sachin 你能分享你的索引映射吗?另外,如果您可以与预期的搜索结果一起共享一些示例索引数据会更好
    • 谢谢,我已经找到了解决方案。我没有显式映射,我使用的是高级弹性搜索客户端提供的默认映射。
    【解决方案2】:

    问题在于 Django-Elasticsearch-Dsl 所做的隐式映射。在将字段显式映射为关键字后,查询工作得很好。 这是documents.py以及我的映射方式:

    SubCategory3 = fields.TextField(
                       fields={'raw': fields.KeywordField()},
                       analyzer="keyword")
    

    我的模型将 SubCategory3 定义为 TextField,因此 Elasticsearchs 映射默认将其作为 TextField。所以提供映射解决了这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-02
      • 2014-11-18
      • 1970-01-01
      • 2020-06-12
      • 2015-08-15
      • 1970-01-01
      • 1970-01-01
      • 2012-07-18
      相关资源
      最近更新 更多