求推荐适用于ElasticSearch的布尔查询解析器及转换开源库
适用于Elasticsearch的布尔查询解析器推荐
当然有不少靠谱的工具和库能帮你搞定这个需求!不管是Elasticsearch官方自带的能力,还是开源社区的成熟方案,都能轻松把带AND/OR、括号分组、精确匹配("")、通配符(*?)的查询语句转换成标准的ES JSON查询结构。下面是几个实用选项:
1. Elasticsearch原生Query String Query
这应该是最省心的方案——ES本身就支持直接解析这类布尔查询语法,完全不用额外依赖第三方库。它完美兼容你提到的所有语法:括号分组、AND/OR逻辑、引号精确匹配、*通配符、?占位符等等。
比如你给出的示例查询语句,直接写成Query String格式:
(city:"New York" AND state:"NY") AND ((businessName:"Java" AND businessName:"Shop") OR (category:"Java" AND category:"Shop"))
对应的ES查询JSON可以写成:
{ "query": { "query_string": { "query": "(city:\"New York\" AND state:\"NY\") AND ((businessName:\"Java\" AND businessName:\"Shop\") OR (category:\"Java\" AND category:\"Shop\"))", "default_operator": "AND" } } }
ES会自动帮你把这个字符串解析成对应的bool查询结构(包含must/should子句),和你手动写的JSON效果完全一致。如果需要作为过滤条件,把它放到filter里也同样适用。
2. Lucene QueryParser(底层原生支持)
因为Elasticsearch底层依赖Lucene,所以Lucene自带的QueryParser是最根源的解析工具。它能直接解析这类布尔查询语法,然后你可以通过ES的客户端或API把解析后的Lucene Query转换成ES DSL。
不同语言都有对应的实现:
- Java:直接使用
org.apache.lucene.queryparser.classic.QueryParser,解析后可以通过ES的Java Client轻松转换成DSL结构。 - Python:可以借助
lucene库的Python绑定,或者用elasticsearch-dsl-py封装好的接口来完成转换。
3. 开源社区专用库
如果需要更定制化的支持,社区里还有不少专门做这类转换的库:
- BoolQL:专门针对类SQL布尔查询转ES DSL的库,语法简洁,支持你提到的所有特性,集成起来很方便。
- Elasticsearch SQL:ES官方提供的SQL支持功能,虽然是SQL语法,但同样支持布尔逻辑、通配符等特性。你可以把类似SQL的查询语句转换成ES DSL,比如你的示例可以写成:
通过ES的SQL API就能直接转换成对应的SELECT * FROM your_index WHERE city = 'New York' AND state = 'NY' AND ((businessName = 'Java' AND businessName = 'Shop') OR (category = 'Java' AND category = 'Shop'))bool过滤查询。
4. 自定义解析(适合特殊需求)
如果以上方案都满足不了你的定制化需求,还可以用ANTLR这类语法分析工具,自己定义查询语法规则,手动解析查询语句后生成ES JSON结构。不过这个方案成本较高,适合有特殊语法要求的场景。
内容的提问来源于stack exchange,提问作者FlamingMoe
相关产品推荐
相关产品推荐

