对于短语搜索,我们只想在完全匹配(不忽略停用词)时调出结果。如果它是非短语搜索,即使单词的根形式匹配等,我们也可以很好地显示结果。
我们目前通过standardTokenizer,StopFilter,PorterStemFilter和LowerCaseFilter传递我们的数据。因此,当用户想要搜索“密码管理”时,搜索会显示包含“密码管理器”的结果。
如果我删除StemFilter,那么我将无法匹配非短语查询的单词的根形式。我在想是否应该将相同的数据作为文档中两个字段的一部分进行索引。
对于第一个字段(用于短语搜索),将使用以下标记器/过滤器: StandardTokenizer,LowerCaseFilter
对于第二个字段(非短语搜索) StandardTokenizer,StopFilter,PorterStemFilter,LowerCaseFilter
现在,根据是否是短语搜索,我需要重写用户的查询以在相应的字段中进行搜索。
这是解决此问题的正确方法吗? 有没有其他方法可以在不增加索引大小的情况下实现这一目标?
假设用户的查询是
summary:"Furthermore, we should also fix this"
在内部,这将被翻译为
summary_field1:"Furthermore, we should also fix this"
如果用户的查询是
summary:(Furthermore, we should also fix this)
在内部,这将被翻译为
+summary_field2:furthermor +summary_field2:we +summary_field2:should +summary_field2:also +summary_field2:fix
summary_field1和summary_field2都索引相同的数据。 summary_field1仅通过StandardTokenizer和LowerCaseFilter,而summary_field2通过StandardTokenizer,StopFilter,PorterStemFilter和LowerCaseFilter。
如果我在这里遗漏了什么,请告诉我。
答案 0 :(得分:3)
通过定义两个不同的字段,您可以搜索完全匹配。 通过使用提升,您还可以在一个查询中引入结果。例如:
(firstField:"password management")^5 OR (secondField:"pasword management")^1