对于词组搜索,我们只有在完全匹配(不忽略停用词)时才会显示结果。如果它是非短语搜索,即使单词的根形式匹配等,我们也可以很好地显示结果。
我们目前通过standardTokenizer,StopFilter,PorterStemFilter和LowerCaseFilter传递我们的数据。因此,当用户想要搜索"密码管理"时,搜索会显示包含"密码管理器"的结果。
如果我删除StemFilter,那么我将无法匹配非短语查询的单词的根形式。我在想是否应该将相同的数据作为文档中两个字段的一部分进行索引。
我在Different indexing and search strategies on same field without doubling index size?问了同样的问题。然而,办公室的人们并不乐意将相同的数据作为两个字段的一部分进行索引。 (我们目前在lucene文档中有大约20个文本字段)。有没有办法支持我上面列出的使用TokenFilters的情况?
说,对于StopFilter,进行更改以便它同时发出输入令牌和? (对于忽略的单词)具有相同的位置增量。类似地,对于StemFilter,它以相同的位置增量发出输入令牌和带阻令牌。基本上输入和输出令牌(甚至是忽略的)具有相同的位置。
继续采用这种方法是否安全?有没有其他人面临这里列出的要求?是否有任何过滤器可以使用哪种类似于我在方法中提到的内容?
由于
答案 0 :(得分:1)
我不明白你的意思是"输入和输出令牌。"您是否存储了两次数据 - 一次是阻止数据还是非阻止数据?
如果您没有存储两次,我认为您的方法无效。假设存储的单词是jumping
,他们搜索jumped
。您的查询解析器可以发出jump
和jumped
,但它仍然不会与jumping
匹配,除非您将值存储为jump
。
如果您要将值保存一次作为阻止值,而将一次保存为非阻塞值,那么为什么不将它存储在两个字段中呢?然后你不必处理怪异的tokenizer更改。