ElasticSearch中的复杂Lucene查询

时间:2018-07-03 09:01:27

标签: java 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)。它适用于简单的查询,但是在使用 spanNear spanOr 之类的函数时则无效。参见查询的一部分:

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库来生成查询,以防出现问题。预先感谢。

1 个答案:

答案 0 :(得分:1)

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

要在Elasticsearch中运行这些查询,API支持span queries的完整称谓,包括span_nearspan_or

还有一些查询解析器,它们的语法确实支持跨度查询,例如SurroundComplex Phrase。不过,ElasticSearch并没有开箱即用,但如果您愿意做一些工作以将一个插件组合在一起以在ElasticSearch中使用它们(我已经看到了该过程,并且看起来相当易于管理,但我并不十分熟悉。