【发布时间】:2019-06-29 13:58:24
【问题描述】:
我正在尝试从使用 Lucene 索引的文档中搜索 DOI 字段。 DOI 的值类似于“10.1186/1756-3305-7-73”。请原谅我,如果这个问题很愚蠢,但这是我第一次将手浸入 Lucene。
错误是:
[2019-02-05 17:37:18,233] 错误 (ExceptionHandler.java:36) - 字段“doi”在没有位置数据的情况下被索引;无法运行 PhraseQuery (phrase=doi:"10.1186 s12937 015 0065 5") java.lang.IllegalStateException:字段“doi”没有位置数据被索引;无法运行 PhraseQuery (phrase=doi:"10.1186 s12937 015 0065 5")
问题详情:
- Lucene 版本 - 7
- 查询表达式 - doi:"10.1186/1756-3305-7-73"
- 已解析查询 - doi:"10.1186 1756 3305 7 73"(请注意,它删除了正斜杠和连字符)
- 试用的分析器 - 英文分析器、标准分析器、简单分析器
- 用于导航 Lucene 索引的软件 - Luke v7.6.0
不,我没有弄错。 “DOI”字段的值已使用 Lucene 编制索引。
这是错误的完整日志:
[2019-02-05 17:37:18,233] 错误 (ExceptionHandler.java:36) - 字段“doi”在没有位置数据的情况下被索引;无法运行 PhraseQuery (phrase=doi:"10.1186 s12937 015 0065 5") java.lang.IllegalStateException:字段“doi”没有位置数据被索引;无法运行 PhraseQuery (phrase=doi:"10.1186 s12937 015 0065 5") 在 org.apache.lucene.search.PhraseQuery$1.getPhraseMatcher(PhraseQuery.java:434) 在 org.apache.lucene.search.PhraseWeight.scorer(PhraseWeight.java:46) 在 org.apache.lucene.search.Weight.bulkScorer(Weight.java:177) 在 org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:667) 在 org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:471) 在 org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:592) 在 org.apache.lucene.search.IndexSearcher.searchAfter(IndexSearcher.java:447) 在 org.apache.lucene.luke.models.search.SearchImpl.search(SearchImpl.java:283) 在 org.apache.lucene.luke.models.search.SearchImpl.search(SearchImpl.java:273) 在 org.apache.lucene.luke.app.desktop.components.SearchPanelProvider.doSearch(SearchPanelProvider.java:516) 在 org.apache.lucene.luke.app.desktop.components.SearchPanelProvider.access$500(SearchPanelProvider.java:93) 在 org.apache.lucene.luke.app.desktop.components.SearchPanelProvider$ListenerFunctions.execSearch(SearchPanelProvider.java:672) 在 javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022) 在 javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348) 在 javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402) 在 javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259) 在 javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252) 在 java.awt.Component.processMouseEvent(Component.java:6539) 在 javax.swing.JComponent.processMouseEvent(JComponent.java:3324) 在 java.awt.Component.processEvent(Component.java:6304) 在 java.awt.Container.processEvent(Container.java:2239) 在 java.awt.Component.dispatchEventImpl(Component.java:4889) 在 java.awt.Container.dispatchEventImpl(Container.java:2297) 在 java.awt.Component.dispatchEvent(Component.java:4711) 在 java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904) 在 java.awt.LightweightDispatcher.processMouseEvent(Container.java:4535) 在 java.awt.LightweightDispatcher.dispatchEvent(Container.java:4476) 在 java.awt.Container.dispatchEventImpl(Container.java:2283) 在 java.awt.Window.dispatchEventImpl(Window.java:2746) 在 java.awt.Component.dispatchEvent(Component.java:4711) 在 java.awt.EventQueue.dispatchEventImpl(EventQueue.java:760) 在 java.awt.EventQueue.access$500(EventQueue.java:97) 在 java.awt.EventQueue$3.run(EventQueue.java:709) 在 java.awt.EventQueue$3.run(EventQueue.java:703) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74) 在 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:84) 在 java.awt.EventQueue$4.run(EventQueue.java:733) 在 java.awt.EventQueue$4.run(EventQueue.java:731) 在 java.security.AccessController.doPrivileged(本机方法) 在 java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:74) 在 java.awt.EventQueue.dispatchEvent(EventQueue.java:730) 在 java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:205) 在 java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116) 在 java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105) 在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101) 在 java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93) 在 java.awt.EventDispatchThread.run(EventDispatchThread.java:82)
我确实有一种直觉,这里的错误与解析查询表达式有关。我确实注意到 - 和 / 是从我的原始查询中解析出来的,但我不知道如何解决这个问题。对此问题的任何方向都将非常感激。
【问题讨论】: