首页 > 解决方案 > ElasticSearch 中的复杂 Lucene 查询

问题描述

过去几年我们一直在使用 Lucene,我们即将迁移到 ElasticSearch。我们有很多想要重用的 Lucene 查询(复杂的查询)。我在 ElasticSearch 中看到了“query_string”API(https://www.elastic.co/guide/en/elasticsearch/reference/6.3/query-dsl-query-string-query.html#query-string-syntax) . 它对于简单的查询非常有效,但在使用像spanNearspanOr这样的函数时就不行了。请参阅下面的部分查询:

spanNear([spanOr([ADDRESS:13, ADDRESS:13a, ADDRESS:13b, ADDRESS:13c, ADDRESS:13d, ADDRESS:13e, ADDRESS:13f, ADDRESS:13g, ADDRESS:13h, ADDRESS:13i, ADDRESS:13j, ADDRESS:13k, ADDRESS:13l, ADDRESS:13m, ADDRESS:13n, ADDRESS:13r, ADDRESS:13s, ADDRESS:13u, ADDRESS:13v, ADDRESS:13w, ADDRESS:13x, ADDRESS:13y, ADDRESS:13z]), [ADDRESS:carlton, ADDRESS:chalton, ADDRESS:charaton, ADDRESS:charleton, ADDRESS:charlon, ADDRESS:charlson, ADDRESS:charlston, ADDRESS:charlton, ADDRESS:charltons, ADDRESS:charlvon, ADDRESS:charston, ADDRESS:charton, ADDRESS:chorlton, ADDRESS:harlton, ADDRESS:sharlton]))

你知道在不将它们重写为 ES 格式的情况下使用这些查询的最佳方法是什么吗?我们使用 Lucene Java 库来生成查询,以防万一。提前致谢。

标签: javaelasticsearchlucene

解决方案


听起来您是toString从查询中获取的,并希望 ElasticSearch 能够解析它。坏消息,Elasticsearch 中没有任何东西可以解析Query.toString. Lucene 中也没有任何东西可以解析它。对于简单的查询,它可能会输出一个可解析的查询字符串,但这永远不能保证。Query.toString()用于调试,而不是序列化。

要在 elasticsearch 中运行这些查询,API 支持span 查询的完整补充,包括span_nearspan_or

还有一些查询解析器确实具有支持跨度查询的语法,例如SurroundComplex Phrase。不过,ElasticSearch 并没有开箱即用,但是如果您愿意做一些工作以将插件放在一起以在 ElasticSearch 中使用它们,则可能是一种选择(我已经看到过引用的过程,它看起来很容易管理,但我不太熟悉)。


推荐阅读