我正在为我的公司开发一个网站,该网站允许用户查询数据库以获取所需的信息。
当前,用户已经习惯了一种特殊形式的查询,并且我不想让他们改变习惯。因此,我需要将其查询转换为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/