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 库来生成查询,以防万一。提前致谢。
解决方案
听起来您是toString
从查询中获取的,并希望 ElasticSearch 能够解析它。坏消息,Elasticsearch 中没有任何东西可以解析Query.toString
. Lucene 中也没有任何东西可以解析它。对于简单的查询,它可能会输出一个可解析的查询字符串,但这永远不能保证。Query.toString()
用于调试,而不是序列化。
要在 elasticsearch 中运行这些查询,API 支持span 查询的完整补充,包括span_near和span_or
还有一些查询解析器确实具有支持跨度查询的语法,例如Surround和Complex Phrase。不过,ElasticSearch 并没有开箱即用,但是如果您愿意做一些工作以将插件放在一起以在 ElasticSearch 中使用它们,则可能是一种选择(我已经看到过引用的过程,它看起来很容易管理,但我不太熟悉)。
推荐阅读
- c# - Event handler doesn't change text in Label
- javascript - 如何将两个或多个 JSON 对象相加为一个
- java - tizen studio (x64) - 构建签名包 - 创建包失败 - java.io.IOexception:密码无效
- java - 无法在 onActivityResult() 中提示视频
- sql - 有人可以解释一下 SQL 查询吗
- wpf - WPF ComboBox SelectionChanged and DropDownClosed events is not working
- node.js - Typescript - 未处理的拒绝 TypeError:boss.SetBelongToClan 不是函数
- java - Why does the java.time.Clock has zone information?
- laravel - Laravel:在 FormRequest 和自定义规则中传递参数
- node.js - node.js 中的用户角色和基于权限的访问