【问题标题】:What causes "<field> indexed without position data" error in Lucene using Luke?是什么导致使用 Luke 的 Lucene 中出现“<field> indexed without position data”错误?
【发布时间】: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)

我确实有一种直觉,这里的错误与解析查询表达式有关。我确实注意到 - 和 / 是从我的原始查询中解析出来的,但我不知道如何解决这个问题。对此问题的任何方向都将非常感激。

【问题讨论】:

    标签: java lucene luke


    【解决方案1】:

    当!经过一整天的角力,我找到了答案。

    不能使用具有唯一标识符类型查询的标准分析器或简单分析器或英文分析器。他们解析或修剪重要的关键字符号,如连字符和/或正斜杠。

    因此,我将关键字分析器 jar 导入 Luke 并使用它搜索查询表达式。

    关键字分析器从here下载并导入Luke。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多