如何用elasticsearch_dsl在单个字段中查询多个字符串?
我来帮你解决这个问题,看起来你遇到的是查询结果只显示部分匹配数据的情况,咱们一步步梳理:
首先,你最初的wildcard查询写法其实是正确的,但大概率是Elasticsearch默认分页只返回10条结果,而你刚好只看到了最后一条匹配的honda_crv,实际索引里可能还有其他匹配文档没有被返回。
解决方法1:调整查询的size参数获取更多结果
如果你的匹配结果数量不多,可以直接设置足够大的size来获取所有匹配文档:
from elasticsearch import Elasticsearch from elasticsearch_dsl import Search client = Elasticsearch([{'host': MY_HOST, 'port': MY_PORT, 'timeout': TIME_OUT}]) # 初始化搜索,指定wildcard查询 s = Search(using=client, index="myIndex").query("wildcard", cars_model="honda*") # 设置size为足够容纳所有匹配结果的数值(比如1000,根据你的数据量调整) s = s.size(1000) response = s.execute() # 遍历所有匹配结果 for hit in response: print(hit.cars_model)
解决方法2:用Scan滚动获取大量结果
如果匹配的文档数量非常多(超过1000条),建议使用Scan来滚动获取全部数据,避免单次查询的性能问题:
from elasticsearch import Elasticsearch from elasticsearch_dsl import Scan client = Elasticsearch([{'host': MY_HOST, 'port': MY_PORT, 'timeout': TIME_OUT}]) # 使用Scan执行wildcard查询,自动滚动获取所有结果 scan = Scan(using=client, index="myIndex", query={"wildcard": {"cars_model": "honda*"}}) for hit in scan: print(hit.cars_model)
纠正你尝试的其他错误写法
- query_string查询的正确写法:
你之前的query_string写法有误,应该直接把参数传给query方法,而不是传整个body:
s = Search(using=client, index="myIndex").query( "query_string", query="cars_model:honda*", # 指定字段和查询规则 default_operator="or", analyze_wildcard=True ).execute()
- multi_match的误用:
multi_match是用来在多个字段中搜索同一个查询词的,不是用来匹配多个值的。如果你需要精确匹配多个指定车型,应该用terms查询:
from elasticsearch_dsl import Search s = Search(using=client, index="myIndex").query( "terms", cars_model=["honda_accord", "honda_crv", "honda_civic"] ).execute()
总结
- 前缀匹配(比如
honda*)优先用wildcard或prefix查询,记得调整size或用Scan获取全部结果; - 精确匹配多个固定值用
terms查询; - 你之前只看到
honda_crv的原因,几乎可以肯定是默认分页只返回了10条结果,而这条刚好在返回列表的末尾。
内容的提问来源于stack exchange,提问作者Anil_M
相关产品推荐
相关产品推荐

