问题标签 [compass-lucene]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
303 浏览

java - 一个基于 Apache Lucene 的 DAO?

我正在构建一个带有后端 RESTful Web 服务的 Web 应用程序。

我的一个表几乎是独立的,即仅从另一个表引用的行以一种我可以在没有连接的情况下愉快地生活并且只在需要时通过主键获取的方式引用。然而,这个表包含很多行,并且针对它执行的搜索都尖叫“Lucene”。MySQL 无法以合理的响应时间处理这些查询。

所以我想使用 Lucene 来搜索这个表。过去我广泛使用 Solr,因此我熟悉概念和术语。我在想,鉴于上述情况,而不是 SQL 到 Lucene 索引同步,我看不出为什么我不应该简单地使用 Lucene 作为这个特定实体的规范存储。基本上我想要一个“Lucene DAO”实现来替换这个特定表的当前 Hibernate DAO 实现。

所以我的问题是:

  1. 有什么理由我应该避免这种情况并坚持 SQL-to-index 同步?
  2. 如果“Lucene DAO”是一种可行的方法,那么是否有任何库可以为类似的东西提供基础?我试图搜索但找不到任何东西。
  3. 我遇到过Hibernate Search它只完成了我正在寻找的一半,但我可以尝试将其仅用于搜索。有没有人有使用 Hibernate Search 的经验?

编辑:我现在遇到了Compass,一眼看去似乎就是我要找的东西。有没有人有这方面的经验?


编辑#2:Compass 已经停产并被 ElasticSearch 取代,这并不完全相同(服务而不是组件)。Hibernate Search 也不是我想要的。底线是这是一种有效的方法,但目前必须自己实现这样的 DAO。

0 投票
1 回答
419 浏览

grails - JDBC 存储中的共享 Compass/Lucene 索引

使用 Grails 中的可搜索插件(在底层使用 Compass/Lucene),我们尝试在两个不同的 Web 应用程序之间共享搜索索引。一个应用程序仅以只读方式访问数据。另一个应用程序允许修改数据并负责在任何更改时更新索引或根据需要进行完整的重新索引。

为了存储索引,我们使用 JDBC 存储(两个应用程序都指向同一个数据库)http://www.compass-project.org/docs/latest/reference/html/core-connection.html

不幸的是,一旦我们在一个应用程序中重建整个索引,另一个应用程序似乎缓存了无效数据,如果执行搜索,则会引发异常:

我们可以将索引从一个应用程序重建到另一个应用程序这一事实进行沟通,以便可以执行一些清理工作。

  • 有人对 Grails 和 Searchable 插件有类似的问题吗?
  • 是否可以丢弃 Compass/Lucene 缓存的数据?
  • 一般可以禁用缓存吗?
0 投票
2 回答
2714 浏览

java - 搜索时忽略变音符号

我正在使用 Compass/Lucene 来搜索和索引我的数据库。我希望在搜索时忽略变音符号和字符大小写,这样查询“foo”将匹配“Fóo”和“foo”,而对“fóó”的查询将匹配“fóo”和“fOO”。

根据我读过的内容,我似乎需要更改 Compass 在索引和搜索上下文时使用的默认分析器。我找到了指定要使用的分析器的位置,但似乎找不到满足我要求的分析器实现。是否已经存在忽略变音符号和字符大小写的分析器,还是我需要自己编写?

0 投票
1 回答
224 浏览

java - 罗盘-lucene中的索引枚举

我正在使用 Compass 从 DTO 对象中过滤数据。@SearchableComponent如果它是 POJO 对象,我标记字段,如果它SearchableProperty是字符串。这非常有效:我得到了对象和字符串的索引。

我的问题是如何注释 ENUM 数据类型?

我有的枚举示例:

在这个片段中我应该在哪里放置注释以及应该放置哪个注释?

0 投票
1 回答
365 浏览

java - 带有日期的 Compass Lucene 查询的空结果集

我正在使用 Compass 对内存数据结构中的数据进行查询。它适用于搜索字符串和枚举值,现在我想搜索日期。

搜索条件由@SearchRestriction注释注释。关于 someDate 的示例:

在可搜索的数据中,SomeDate 的注释如下:

SomeDate内部可搜索数据由new Date();) 生成,查询字符串为20120802

调试器的情况: 此代码生成如下查询:

someDate是我要查找的字段的名称,并且20120802是按 yyyyMMdd 顺序排列的日期。

问题: 运行此查询时未返回任何结果。我得到一个空列表。查询中的日期与日期对象中的相同。

怎么了?? 这是Date用 Compass 搜索 s 的错误方法吗?我只能找到有关日期的范围查询,但我找不到确切日期或部分确切日期的搜索。

0 投票
1 回答
710 浏览

java - 我在哪里可以找到有关使用 Lucene 和 Compass 的有用信息?

我正在学习 Lucene 和 Compass(Compass 是因为我正在处理的代码很旧),并且我正在尝试从哪里开始(甚至从什么开始阅读)。Lucene in Action 太旧了,代码甚至没有运行,所以没用。如果我要使用 Compass,我也不知道是否应该阅读大量有关 Lucene 的信息?

我在哪里可以找到关于 Compass 的好文章?该文档是 Lucene 中非常技术性和预期的知识。

0 投票
1 回答
81 浏览

java - @SearchableComponent 和前缀

我正在阅读有关 Compass(遗留代码)的文档,但我不了解 @SearchableComponent 和 prefix 属性。有人可以在不参考文档的情况下尝试用自己的话解释它们的含义,以及您应该如何使用它们吗?

0 投票
1 回答
1882 浏览

grails - 可搜索索引在手动更新时被锁定 (LockObtainFailedException)

我们有一个在负载均衡器后面运行的 Grails 项目。服务器上运行着三个 Grails 应用程序实例(使用单独的 Tomcat 实例)。每个实例都有自己的可搜索索引。因为索引是分开的,所以自动更新不足以保持应用程序实例之间的索引一致。因此,我们禁用了可搜索的索引镜像,并且索引的更新是在计划的石英作业中手动完成的。根据我们的理解,应用程序的其他部分不应修改索引。

石英作业每分钟运行一次,它从数据库中检查应用程序更新了哪些行,并重新索引这些对象。该作业还检查同一个作业是否已经在运行,因此它不会执行任何并发索引。应用程序在启动后几个小时内运行良好,然后在作业开始时突然抛出 LockObtainFailedException:

22.10.2012 11:20:40 [xxxx.ReindexJob] 错误无法更新可搜索索引,类 org.compass.core.engine.SearchEngineException:无法打开子索引 [产品] 的编写器;嵌套异常是 org.apache.lucene.store.LockObtainFailedException:锁定获取超时:SimpleFSLock@/home/xxx/tomcat/searchable-index/index/product/lucene-a7bbc72a49512284f5ac54f5d7d32849-write.lock

根据上次执行作业的日志,重新索引已完成,没有任何错误,作业成功完成。尽管如此,这次re-index操作还是抛出了锁定异常,就好像之前的操作没有完成,锁还没有被释放一样。在应用程序重新启动之前,锁不会被释放。

我们尝试通过手动打开锁定的索引来解决问题,导致日志打印如下错误:

22.10.2012 11:21:30 [manager.IndexWritersManager] 错误非法状态,将索引编写器标记为打开,而另一个标记为打开子索引 [产品]

在此之后,工作似乎正常工作并且不会再次陷入锁定状态。但是,这会导致应用程序不断使用 100% 的 CPU 资源。以下是石英作业代码的缩短版本。

任何帮助将不胜感激,以解决问题,在此先感谢。

根据 JMX CPU 示例,Compass 似乎在幕后进行了一些调度。从 1 分钟的 CPU 样本来看,在比较正常和 100% CPU 实例时似乎几乎没有什么不同:

  • org.apache.lucene.index.IndexWriter.doWait() 正在使用大部分 CPU 时间。
  • Compass Scheduled Executor Thread 显示在线程列表中,这在正常情况下是看不到的。
  • 一个 Compass Executor 线程正在执行 commitMerge,在正常情况下,这些线程都没有执行 commitMerge。
0 投票
0 回答
364 浏览

lucene - 集群环境中的 Compass/Lucene

我在集群环境中收到以下错误,其中一个节点正在索引对象,而另一个节点对缓存中的段感到困惑。即使在服务器重新启动后,节点也不会自行恢复。正在编制索引的节点可能正在合并段并删除其他节点不知道的。我没有触及 invalidateCacheInterval 设置并添加了 compass.engine.globalCacheIntervalInvalidation 属性,时间为 500 毫秒。它没有帮助。

在另一个节点上搜索和索引时会发生这种情况。

有人可以帮我解决这个问题吗?也许要求指南针重新加载缓存或从头开始,而不必重新索引所有对象?

org.compass.core.engine.SearchEngineException:无法使用查询 [+type:...)] 进行搜索;嵌套异常是 org.apache.lucene.store.jdbc.JdbcStoreException: No entry for [_6ge.tis] table index_objects org.apache.lucene.store.jdbc.JdbcStoreException: No entry for [_6ge.tis] table index_objects at org. apache.lucene.store.jdbc.index.FetchOnBufferReadJdbcIndexInput$1.execute(FetchOnBufferReadJdbcIndexInput.java:68) at org.apache.lucene.store.jdbc.support.JdbcTemplate.executeSelect(JdbcTemplate.java:112) at org.apache.lucene .store.jdbc.index.FetchOnBufferReadJdbcIndexInput.refill(FetchOnBufferReadJdbcIndexInput.java:58) at org.apache.lucene.store.ConfigurableBufferedIndexInput.readByte(ConfigurableBufferedIndexInput.java:27) at org.apache.lucene.store.IndexInput.readVInt(IndexInput .java:78) 在 org.apache。

0 投票
1 回答
1241 浏览

spring - spring bean 中的 hibernate.search.default.directory_provider 而不是 persistence.xml


我的处境相当糟糕。我们使用 compass 与 Lucene 进行 Hibernate 搜索集成,并实现了数据库目录搜索(使用JdbcDirectory)而不是 FSDirectoryProvider、RAMDirectoryProvider 等。

问题是目录提供程序是作为 META-INF/persistence.xml 中的属性传递的,如下所示:

我们需要将数据库详细信息传递给 JdbcDirectoryProvider,因为JdbcDirectory需要传递数据源。

我们使用带有数据库和索引详细信息的属性文件(在类路径中)以非常规的方式构建数据源(用于目录提供程序)。

如果我们将uk.company.JdbcDirectoryProvider配置为 spring bean,我们可以注入数据源。这适用于 Tomcat,但不适用于 OAS 或 Weblogic,因为我们在 persistence.xml 中传递 directory_provider。可能是因为数据源是由 spring 初始化的(因为类加载器在这些应用程序服务器中的工作方式)。

我的问题是我们如何直接在 aSpring bean 中配置hibernate.search.default.directory_provider而不是 persistence.xml?

最近的地方是:

但它只需要三个属性:

解决方案

您可以将 spring bean 中的休眠属性作为jpaProperties 传递