Q、term 和 terms 等 elasticsearch 查询的问题

Problem with elasticsearch queries like Q, term and terms

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)

这些查询执行时没有抛出任何错误,只是 returns 一个空白响应。

更新: 我正在使用 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']

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

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

要搜索准确的字词,您需要使用 Category.keyword 字段或更改字段的映射。如果索引中存在 "Blue""Black" 个词,就会出现搜索结果。

而在执行搜索查询时,您在第一个查询中使用 match query, which analyzes the text (using standard analyzer(如果未指定分析器),因此您将在第一个查询中获得搜索结果。

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

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

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