regex - Lucene语法用于更复杂的查询

标签 regex elasticsearch lucene

我正在为我的公司开发一个网站,该网站允许用户查询数据库以获取所需的信息。

当前,用户已经习惯了一种特殊形式的查询,并且我不想让他们改变习惯。因此,我需要将其查询转换为Lucene的查询语法。

在某些情况下,我不确定使用Lucene语法实现它们的最佳方法是什么,我想知道您是否有更好的主意:

"Current Query"   :  serverRole=~'(ServerOne|ServerTwo|ServerThree)'

"Lucene Suggested":  (serverRole:*ServerOne* OR serverRole:*ServerTwo* OR serverRole:*ServerThree*)

考虑到我正在使用正则表达式转换这些查询,因此,例如,如果元素(ServerOne|ServerTwo|ServerThree.....)的数量是动态的,我将面临的困难之一就是如何做到这一点:
luceneQuery = currentQuery
                .replace(/(==~|=~)('|")([a-zA-Z0-9]+)(\|)([a-zA-Z0-9]+)('|")/g, ':*$3 OR $5*')

另一个查询例如:
"Current Query"   : OS=~'SLES1[12]'

"Lucene Suggested": (OS:*SLES11* OR OS:*SLES12*)

最佳答案

我建议您在Lucene上检查BooleanQuery()来创建更复杂的查询,例如Wildcard,Term,Fuzzy U可以在构建查询时使用Occur参数将所有内容包括在内。举个例子

 Query query1 = new WildcardQuery(new Term("contents", "*ServerOne*"));
 Query query2 = new WildcardQuery(new Term("contents", "*ServerTwo*"));

 BooleanQuery booleanQuery = new BooleanQuery.Builder()
            .add(query1, BooleanClause.Occur.SHOULD)
            .add(query2, BooleanClause.Occur.SHOULD)
            .build();

您还可以直接运行正则表达式查询,但是当索引字段变得复杂时,查找正则表达式匹配项将花费一些时间

关于regex - Lucene语法用于更复杂的查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58911533/

相关文章:

elasticsearch - Elasticsearch在日期范围上的聚合

scala - 什么是 `path.home` 变量以及如何设置它?

mysql - 将 MySQL 数据库和 XML 混合处理成 Solr 索引

java - 正则表达式从url中提取字符串

python - 字符串模式匹配python

elasticsearch - Elasticsearch -更新同义词配置文件后重新启动索引

performance - 在Elasticsearch中优化使用简单博客应用程序的类型和路由

regex - 我们可以在 Tornado RequestHandler 中访问 URL 的路径参数吗?

java - 用于分隔括号中字符串的正则表达式

lucene - 如何使用 Lucene 进行个人姓名(名字、姓氏)搜索?