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。所以提供映射解决了问题。
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。所以提供映射解决了问题。