我是Infinispan的新手,我目前正在尝试使用搜索功能。我已经尝试过密切关注文档。首先我更新我的cache.xml:
<namedCache
name="cache">
<transaction transactionMode="NON_TRANSACTIONAL"/>
<indexing enabled="true" indexLocalOnly="true"/>
</namedCache>
我正在尝试编写一个查询,该查询将为我提供search_value属性的结果列表。这是我的Java代码:
SearchManager searchManager = org.infinispan.query.Search.getSearchManager(cache);
Term t = new Term("attribute_name", search_value);
Query q = new TermQuery(t);
CacheQuery cacheQuery = searchManager.getQuery(q);
List<Object> found = cacheQuery.list();
但是,当我尝试运行测试时,我收到此错误:
org.apache.lucene.store.LockObtainFailedException: Lock obtain timed out: NativeFSLock@.\Key\write.lock
at org.apache.lucene.store.Lock.obtain(Lock.java:84)
at org.apache.lucene.index.IndexWriter.<init>(IndexWriter.java:1098)
at org.hibernate.search.backend.impl.lucene.IndexWriterHolder.createNewIndexWriter(IndexWriterHolder.java:148)
at org.hibernate.search.backend.impl.lucene.IndexWriterHolder.getIndexWriter(IndexWriterHolder.java:115)
at org.hibernate.search.backend.impl.lucene.AbstractWorkspaceImpl.getIndexWriter(AbstractWorkspaceImpl.java:117)
at org.hibernate.search.backend.impl.lucene.LuceneBackendQueueTask.applyUpdates(LuceneBackendQueueTask.java:101)
at org.hibernate.search.backend.impl.lucene.LuceneBackendQueueTask.run(LuceneBackendQueueTask.java:67)
at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
at java.util.concurrent.FutureTask$Sync.innerRun(Unknown Source)
at java.util.concurrent.FutureTask.run(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
13/08/02 14:08:25 ERROR lucene.LuceneBackendQueueTask: HSEARCH000072: Couldn't open the IndexWriter because of previous error: operation skipped, index ouf of sync!
导致writelock错误的原因是什么?我甚至试图仅使用索引配置删除Java部分,并且存在相同的错误。我没有正确配置缓存吗?任何帮助是极大的赞赏!谢谢!
答案 0 :(得分:1)
基于Hibernate Search和Apache Lucene的底层搜索引擎使用锁来请求对索引的独占写访问。 假设您没有第二个应用程序尝试在同一个索引目录上写入,您可能在目录中有一个遗留锁定文件来自一个被杀死的JVM或硬件崩溃。
查找在文件系统上创建的目录,该目录与您正在使用的索引(索引)同名,并删除标记文件 write.lock (如果您是确定没有进程正在编写它。)
您还可以配置不同的锁定策略,但请确保您不会自己拍摄: LockFactory configuration
如果这不是来自先前被杀死的JVM的遗留锁,那么可能是您正在运行多个Infinispan实例。确保它们将索引存储在单独的基目录中(默认为您启动进程的当前路径)。