You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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)

纠正你尝试的其他错误写法

  1. 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()
  1. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:46:37