用Java解析搜索查询
我一直试图找到一种简单的方法来解析搜索查询,并将其转换为数据库的SQL查询 我找到了两种解决办法:用Java解析搜索查询,java,search,Java,Search,我一直试图找到一种简单的方法来解析搜索查询,并将其转换为数据库的SQL查询 我找到了两种解决办法: :功能强大的基于Java的搜索引擎,包含一个查询解析器,但它不是非常可配置的,我可以找到一种方法轻松地对其进行破解/调整,以创建SQL查询 :一个经验丰富的文本词法分析器。用于构建从编译器到sky Scraper的任何东西。ANTLR是高度可配置的,但是从现在开始,每个接触代码的人都必须学习一种新的语言 还有其他想法吗?在很大程度上取决于需要解析的查询类型,以及数据库中数据的结构。我假设您没有尝试
还有其他想法吗?在很大程度上取决于需要解析的查询类型,以及数据库中数据的结构。我假设您没有尝试在数据库中进行全文搜索(即,在整个数据库中使用搜索引擎),因为大多数信息检索人员都会告诉您,这方面的性能非常糟糕。倒排索引无疑是最好的方法
告诉我们更多关于实际问题的信息:用户将输入什么,他们期望输出什么,以及数据模型是什么样的。设计一个没有这些信息的搜索解决方案,你会得到一个远远不是最优的结果。你到底在想什么?我曾使用Lucene进行文本搜索,但它最擅长的是建立索引并进行搜索,而不是访问数据库 我最近建立了一个系统,通过将所有列(用空格分隔)连接到一个字段中,并将其弹出到Lucene中,然后在一个单独的列中添加主键,在Lucene中为一个表编制索引。Lucene完成了所有的搜索,并返回了一个主键列表,我用它来提取一组填充的结果并显示给用户 在我看来,将搜索查询转换为SQL语句似乎有点混乱
另外,这里有一个。您可以正确地假设我不是在寻找全文搜索。 该信息类似于图书信息的架构: 名称:字符串,发布者:字符串,页数int,发布日期:日期 搜索查询的种类如下:
您可以尝试使用类似(Java编译器)的东西来实现解析器,或者只是通过蛮力手动解析字符串。每次遇到表达式时,都将其表示为对象。然后,您只需将表达式树转换为where子句 例如:“哈利·波特”变成了 “publisher:Nature*pages>100”变成 然后,一旦有了这些,就很容易将它们转换为SQL:
FieldContainsExp.toSQL(StringBuffer sql, Collection<Object> args) {
sql.append(fieldName);
sql.append(" like ");
sql.append("'%?%'");
args.add(value);
}
AndExp.toSQL(StringBuffer sql, Collection<Object> args) {
exp1.toSQL(sql, args);
sql.append(" AND ");
exp2.toSQL(sql, args);
}
FieldContainsExp.toSQL(StringBuffer sql,集合参数){
追加(字段名);
sql.append(“like”);
追加(“%?%”);
参数。添加(值);
}
toSQL(StringBufferSQL,集合参数){
exp1.toSQL(sql,args);
附加(“和”);
exp2.toSQL(sql,args);
}
你可以想象其他的情况。您可以根据自己的需要,尽可能深入地嵌套和表达 是一个非常轻量级的Java库,它能够以对象图的形式在Java中构造(动态)SQL查询
在构建动态SQL查询时,这是一种比通常的字符串表示方法好得多的技术
免责声明:我对这个项目做出了一些非常微小的贡献尝试将ORM工具(如openJPA)和Compass(OSEM框架)结合起来。 它会自动索引通过ORM工具完成的更新,并为您提供Lucene搜索功能。之后,当然可以从数据库中检索对象。 它可以执行任何基于SQL的搜索解决方案。String[]数组
int checkWord(String searchWord)
{
for(int i = 0; i < array.length; i++)
{
if(searchWord.equals(array[i]))
return i;
}
return 0;
}
int校验字(字符串搜索字)
{
for(int i=0;i
非常有趣。似乎IBatis没有映射和XML,但这并不能真正回答问题。
FieldContainsExp.toSQL(StringBuffer sql, Collection<Object> args) {
sql.append(fieldName);
sql.append(" like ");
sql.append("'%?%'");
args.add(value);
}
AndExp.toSQL(StringBuffer sql, Collection<Object> args) {
exp1.toSQL(sql, args);
sql.append(" AND ");
exp2.toSQL(sql, args);
}
int checkWord(String searchWord)
{
for(int i = 0; i < array.length; i++)
{
if(searchWord.equals(array[i]))
return i;
}
return 0;
}