ElasticSearch是否支持正则匹配字段名执行查询?
实现ElasticSearch中对所有sentence_*字段的查询
你提到的直接在match查询中使用sentence_*作为字段名的方式确实无法生效,因为Elasticsearch的match查询不支持字段名通配符。不过有两种常用方法可以实现你的需求:
方法一:使用multi_match查询配合字段通配符
multi_match查询支持通过通配符指定多个目标字段,你可以这样构造查询:
query_body = { "query": { "multi_match": { "query": "persistent", "fields": ["sentence_*"] } } } result = client.search(index=INDEX_NAME, body=query_body) print(result)
这个查询会匹配所有以sentence_开头的文本字段,返回包含目标关键词的文档。
方法二:通过copy_to统一字段(更高效)
如果查询频率较高,建议在索引映射的动态模板中添加copy_to配置,把所有sentence_*字段的内容复制到一个统一的字段(比如all_sentences),之后直接查询这个字段即可,性能更优。
修改后的索引映射配置:
KNN_INDEX = { "settings": { "index.knn": True, "index.knn.space_type": "cosinesimil", "index.mapping.total_fields.limit": 10000, "analysis": { "analyzer": { "default": { "type": "standard", "stopwords": "_english_" } } } }, "mappings": { "dynamic_templates": [ { "sentence_vector_template": { "match": "sent_vec*", "mapping": { "type": "knn_vector", "dimension": 384, "store": True } } }, { "sentence_template": { "match": "sentence*", "mapping": { "type": "text", "store": True, "copy_to": "all_sentences" # 添加这行,复制到统一字段 } } } ], 'properties': { "metadata": { "type": "object" }, "all_sentences": { # 新增统一字段的定义 "type": "text", "store": True } } } }
修改映射后,需要重新索引数据,之后就可以通过简单的match查询实现需求:
query_body = { "query": { "match": { "all_sentences": "persistent" } } } result = client.search(index=INDEX_NAME, body=query_body) print(result)
内容的提问来源于stack exchange,提问作者sunny_kid
相关产品推荐
相关产品推荐

