【问题标题】:Complex Lucene queries in ElasticSearchElasticSearch 中的复杂 Lucene 查询
【发布时间】:2018-07-06 01:28:55
【问题描述】:

过去几年我们一直在使用 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 库来生成查询,以防万一。提前致谢。

【问题讨论】:

  • 不确定我是否了解您要查找的内容。那么,您在 java 中生成 SpanNearQuerySpanOrQuery,并希望在 ElasticSearch 中使用相同的查询而不重写它们?想必你的意思不是要将 java 代码 传递到 ElasticSearch API 中,那么你说不想重写它们是什么意思呢?
  • @femtoRgon 因为 ElasticSearch 允许使用 query_string API 传递 Lucene 查询,所以我只得到了我正在生成的本机 Lucene 查询。当我这样做时,这就是我得到的输出,带有 spanNear 和 spanOr 函数。如果我将该查询发送到 ElasticSearch,它不会找到 spanNear 或 spanOr...
  • 你的意思是你只是从你的查询中得到toString? Elasticsearch(或 Lucene,就此而言)没有任何东西可以解析 Query.toString 的输出。

标签: java elasticsearch lucene


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的回答... Query.toString() 返回 Lucene 查询的字符串表示形式,但它包括 spanNear spanOr 函数... 我将看看环绕和复杂短语。
  • 我觉得我应该重申,toString 序列化查询。 ToString 方法的结果是供人使用的(java, in general 是这样,不仅仅是 lucene 查询)。您看到的“spanNear”和“spanOr”不是函数,它们是人类可读的调试输出。 Surround 和 Complex Phrase 是具有您可能会觉得有用的功能的解析器,但它们都不会解析该字符串。
猜你喜欢
  • 2020-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-27
  • 2020-03-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多