用Java解析搜索查询

用Java解析搜索查询,java,search,Java,Search,我一直试图找到一种简单的方法来解析搜索查询,并将其转换为数据库的SQL查询 我找到了两种解决办法: :功能强大的基于Java的搜索引擎,包含一个查询解析器,但它不是非常可配置的,我可以找到一种方法轻松地对其进行破解/调整,以创建SQL查询 :一个经验丰富的文本词法分析器。用于构建从编译器到sky Scraper的任何东西。ANTLR是高度可配置的,但是从现在开始,每个接触代码的人都必须学习一种新的语言 还有其他想法吗?在很大程度上取决于需要解析的查询类型,以及数据库中数据的结构。我假设您没有尝试

我一直试图找到一种简单的方法来解析搜索查询,并将其转换为数据库的SQL查询

我找到了两种解决办法:

  • :功能强大的基于Java的搜索引擎,包含一个查询解析器,但它不是非常可配置的,我可以找到一种方法轻松地对其进行破解/调整,以创建SQL查询
  • :一个经验丰富的文本词法分析器。用于构建从编译器到sky Scraper的任何东西。ANTLR是高度可配置的,但是从现在开始,每个接触代码的人都必须学习一种新的语言

  • 还有其他想法吗?

    在很大程度上取决于需要解析的查询类型,以及数据库中数据的结构。我假设您没有尝试在数据库中进行全文搜索(即,在整个数据库中使用搜索引擎),因为大多数信息检索人员都会告诉您,这方面的性能非常糟糕。倒排索引无疑是最好的方法


    告诉我们更多关于实际问题的信息:用户将输入什么,他们期望输出什么,以及数据模型是什么样的。设计一个没有这些信息的搜索解决方案,你会得到一个远远不是最优的结果。

    你到底在想什么?我曾使用Lucene进行文本搜索,但它最擅长的是建立索引并进行搜索,而不是访问数据库

    我最近建立了一个系统,通过将所有列(用空格分隔)连接到一个字段中,并将其弹出到Lucene中,然后在一个单独的列中添加主键,在Lucene中为一个表编制索引。Lucene完成了所有的搜索,并返回了一个主键列表,我用它来提取一组填充的结果并显示给用户

    在我看来,将搜索查询转换为SQL语句似乎有点混乱


    另外,这里有一个。

    您可以正确地假设我不是在寻找全文搜索。 该信息类似于图书信息的架构: 名称:字符串,发布者:字符串,页数int,发布日期:日期

    搜索查询的种类如下:

  • 哈利波特(搜索任何既有《哈利波特》又有《哈利波特》的书)
  • 出版商:Nature*pages>100(从Nature开始的出版商提供的书籍超过100本)
  • (“新年”或圣诞节)和礼物(你明白了……)
  • 物理学与出版>2008年1月1日(新物理学书籍)

  • 您可以尝试使用类似(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;
    
    }