java - 卢塞恩。为文本中的每个单词索引一些标记

标签 java lucene query-analyzer

我正在使用 lucene 3.5 和 SpanishAnalyzer (它本身使用 SpanishStemmerStandardTokenizer )。
当SpanishAnalyzer索引包含单词(例如)“claramente”和“claro”的文档时,它们都将被索引为“clar”。
这种行为已被理解并且对我的需求很有用,今天在查询之前,我使用分析器的 tokenStream + incrementToken() 来获取我的搜索词的标记并根据索引进行搜索文档。我没有使用 QueryParser,而是在代码中构建 lucene 查询对象。
但是我希望能够搜索确切的单词(在本例中为 claro),同时又不失去 SpanishAnalyzer 的形态能力。
我可以跳过上面的步骤(tokenStream)并直接搜索“claro”,但不会找到它,因为它被索引为“clar”。
另外,我不想使用 2 个不同的分析器对该字段进行两次索引,因为我需要能够使用包含一个确切单词和一个常规术语的 PhraseQuerySpanNearQuery (形态学)。
所以……我要说到重点了……我想修改 Tokenizer 或 Stemmer 或 Filter(?),这样在索引时它将为每个单词索引 2 个标记,即词干标记和原始标记,在本例中为“claro” "和 "clar",稍后在查询时我可以选择是使用确切的单词还是词干标记。
我需要帮助了解我如何(以及在​​哪里)可以做到这一点,我想编辑应该在词干分析器中的某个地方完成。

顺便说一句,我对希伯来语分析器做了完全相同的事情,它在使用 incrementToken() 时为文本中的每个单词返回几个标记(但我没有源代码)

最佳答案

您需要一个每个位置包含多个标记的索引,因为您希望混合使用词干标记和非词干(=原始)标记来搜索短语。 我会回答 5.3 版本,但 3.5 并没有太大不同。

查看 ReversedWildcardFilter 的源代码在 solr 中。 您将看到每个 token 上的两个步骤:

  1. 存储当前state与原始 token 。所以第一次调用incrementToken() -方法获取词干标记,第二次调用获取原始标记(具有相同的位置)
  2. 选择“markerChar”作为词干标记的前缀。因此,在搜索时,您可以决定是使用词干标记还是原始标记进行搜索。

对于您的SpanishAnalyzer,这意味着例如以下内容:

SpanishAnalyzer的核心是SpanishLightStemFilter。 SpanishLightStemFilter 仅将 token 阻止为 !KeywordAttribute.isKeyword() 。因此,对于索引时间,在SpanishAnalyzer中插入KeywordRepeatFilter并使用前缀标记词干标记。

关于java - 卢塞恩。为文本中的每个单词索引一些标记,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34479459/

相关文章:

java - 如何从输入文件中提取十进制数?

lucene - 使用Lucene的关键字分析器时遇到的问题

java - Lucene 中的索引和搜索日期

sql-server - SQL Server : How to abort a series of batches in Query Analyzer?

sql-server-2008 - 为什么Sql Server建议在索引已经存在的情况下创建索引?

java - Tomcat 6.0 中 Spring 应用程序的部署问题

java - java中生成序列号

java - 禁用处理中的关闭按钮

java - Lucene:使用默认运算符搜索多个字段 = AND

java - 嵌入式 Neo4j 需要哪些 jar?