java - 是什么原因导致 ”使用 Luke 在 Lucene 中没有位置数据的索引”错误?
问题描述
我正在尝试从使用 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”没有位置数据被索引;无法在 org.apache.lucene.search.PhraseQuery$1.getPhraseMatcher(PhraseQuery.java:434) 在 org.apache.lucene.search.PhraseWeight.scorer(PhraseWeight) 运行 PhraseQuery (phrase=doi:"10.1186 s12937 015 0065 5") .java:46) 在 org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:667) 在 org.apache.lucene.Weight.bulkScorer(Weight.java:177) 在 org.apache.lucene。 search.IndexSearcher.search(IndexSearcher.java:471) 在 org.apache.lucene.search.IndexSearcher.search(IndexSearcher.java:592) 在 org.apache.lucene。
我确实有一种直觉,这里的错误与解析查询表达式有关。我确实注意到 - 和 / 是从我的原始查询中解析出来的,但我不知道如何解决这个问题。在这件事上的任何方向都将不胜感激。
解决方案
当!!经过一整天的角力,我找到了答案。
不能使用具有唯一标识符类型查询的标准分析器或简单分析器或英语分析器。他们解析或修剪重要的关键字符号,如连字符和/或正斜杠。
因此,我将关键字分析器 jar 导入 Luke 并使用它搜索查询表达式。
关键字分析器从此处下载并导入 Luke 。
推荐阅读
- c# - `Where`中使用新对象的Linq查询性能
- python - 在引导前端显示 Flask 下拉菜单
- javascript - 将自定义标头与 XMLHttpRequest Open 一起使用时,Jquery.get 函数被无限次调用
- vue.js - 无法从 localhost 与启用 HTTPS 的服务通信
- java - 使用所需参数构建 Spring 批处理项目
- apache-kafka - .net 的 KSQLDB 客户端
- flutter - Flutter - 防止用户将应用程序置于后台并防止在 Flutter Web 上打开其他选项卡
- r - 将字符串合二为一
- python - 如何在 django ORM 中仅获取特定记录的值(通过忽略过滤条件)
- node.js - 如何使用 Multer 将文件上传到两个不同的目录?