0

对于短语搜索,我们只想在完全匹配的情况下显示结果(不忽略停用词)。如果是非短语搜索,即使单词的根形式匹配等,我们也可以很好地显示结果。

我们目前通过standardTokenizer、StopFilter、PorterStemFilter 和LowerCaseFilter 传递我们的数据。因此,当用户想要搜索“密码管理”时,搜索会显示包含“密码管理”的结果。

如果我删除 StemFilter,那么我将无法匹配非短语查询的词根形式。我在想是否应该将相同的数据索引为文档中两个字段的一部分。

我在同一字段的不同索引和搜索策略中问过同样的问题,而不会使索引大小加倍?. 然而,办公室里的人们对于将相同的数据作为两个字段的一部分进行索引并不高兴。(我们目前在 lucene 文档中有大约 20 个文本字段)。有什么方法可以使用 TokenFilters 来支持我上面列出的两种情况?

比如说,对于 StopFilter,进行更改以使其同时发出输入令牌和 ? (对于忽略的单词)具有相同的位置增量。与 StemFilter 类似,它发出具有相同位置增量的输入标记和词干标记。基本上输入和输出标记(甚至被忽略的标记)具有相同的位置。

继续采用这种方法是否安全?有没有其他人遇到过这里列出的要求?是否有现成的过滤器可以做类似于我在方法中提到的事情?

谢谢

4

1 回答 1

1

我不明白您所说的“输入和输出令牌”是什么意思。您是否将数据存储了两次——一次是词干的,一次是非词干的?

如果您不存储两次,我认为您的方法行不通。假设存储的单词是jumping并且他们搜索jumped。您的查询解析器可以发出jumpjumped但它仍然不会匹配jumping,除非您将值存储为jump.

如果您要将值存储一次作为词干,一次存储为非词干,那么为什么不将它存储在两个字段中呢?这样您就不必处理奇怪的标记器更改。

于 2012-01-02T16:15:46.293 回答