java - 数据库全文检索

标签 java sql spring hibernate jpa

关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。












想改进这个问题?将问题更新为 on-topic对于堆栈溢出。

2年前关闭。




Improve this question




我正在寻找一种高效且可读的方式来实现全文搜索。我对搜索有很多要求。请参阅下面的此列表。

要求

  • 业绩
    我的数据库增长得非常快。将所有数据加载到 HEAP 中并做一些 .stream() -magic 不是一个选项。搜索应由 DBMS 执行。
  • 可读性
    我需要一个简单的解决方案。像这样的复杂查询 How to implement simple full text search in JPA (Spring Data JPA)? (参见选项#2)也不是解决方案。我需要一些 JOIN s 并且生成的查询很复杂。
    “索引字段”的开销也是不可能的(对于很多连接数据)。
  • 并发
    应用程序需要可扩展(使用 n 个实例),所以使用 Lucene 的解决方案不是很好here is an example
  • 没有混合技术
    我不想将逻辑混合到不同的系统中。这意味着,整个搜索逻辑应该在 Java 中定义。应避免将 Java 逻辑与 View 或 sql 函数结合使用。

  • 尚未发现的选项
  • QueryDsl
    这是我的旧解决方案。但它非常复杂,自动生成的类产生了很多问题。
  • Lucence
    我喜欢这个。但是只有一个大问题:索引。在所有实例上保持索引更新有点过分了。
  • Very long @Query
    产生的查询变得复杂以处理它。
  • Java.stream()...
    // kinda
    getAllUsers().stream()
      .filter(user -> user.getName().contains(searchTerm)
        || user.getSex().contains(searchTerm) 
        || user.getAge().toString().equals(searchTerm) 
        || ...)
    

    我需要很多数据才能做到这一点。所以这个解决方案也不能很好地扩展。
  • Specification Interface
    我的首选解决方案。但也许还有其他(更好的)解决方案?
  • SearchFiled或类似的
    太多JOINS .数据太多。
  • ?

  • 问题

    您对 Spring-Boot-Application 中的全文搜索有何经验?您知道满足我要求的解决方案吗?

    最佳答案

    如果你已经到了 Lucene,那么更进一步的是 Solr。我没有使用您上面提到的选项,但我确实使用过 Solr,并且可以肯定地说它值得一试,因为它的速度和易用性。

    在你提出的四个约束中,前三个已经得到照顾,我觉得 Solr。

  • 业绩 :Solr 是该领域的可靠候选者。
  • 可读性 :我假设您的意思是代码的可读性。虽然这取决于代码和设计是否完成,但由于缺少 JOIN,Solr 部分对代码、理解和维护非常友好。和其他 RDBMS 概念。
  • 并发 : 来自 lucene.apache.org/solr 的官方文档:

  • Both Lucene and Solr were designed to scale to support large implementations with minimal custom coding.



    并且 Solr 在这方面可以做到以下几点:

    • distributing an index across multiple servers
    • replicating an index on multiple servers
    • merging indexes

  • 没有混合技术 :选择使用 Solr,您至少拥有两种技术:Java 和 Solr。我不确定您是否希望将解决方案保留为纯 Java/JEE。如果是这种情况,那么这可能无法满足该需求。

  • 但是,这个要求:

    The search should be performed by the DBMS.



    肯定没有照顾。

    还有,想不出办法除了定制设计为了这:

    Keep the index up2date on all instances is a bit overkill.



    警告:如果您不熟悉 Solr,可能需要一些时间才能很好地掌握它。

    关于java - 数据库全文检索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59647956/

    相关文章:

    java - 从 Date() 开始的上周日期

    java - 使用握手引理查找具有偶数和的子数组的数量

    sql - unicorn 观测结果的部分非规范化

    php - 为什么我的 MySQL 数据库会添加空行?

    sql - mysql - 从一个表中选择所有内容,并从另一个表中选择一列,其中找到 $var

    mysql - 即使指定了左连接提取,如果没有子项,JPQL 查询也不包含实体

    Java 与 Scala 语法比较

    java - 带有 Spring @Configuration 的属性

    java - getResourceAsStream 返回空指针异常(spring 4)

    java - 二分查找--同一个数组中的 double 和整数