Hibernate Search + Elasticsearch - 去除连续的重复字符
Hibernate Search + Elasticsearch - remove consecutive duplicate characters
我正在将 Hibernate Search 与 Elasticsearch 结合使用,我需要为没有连续重复字符的搜索生成令牌。我检查了 Elasticsearch 的文档,但找不到任何可以满足我需要的东西。我找到了一些关于自定义分析器的信息,但总是根据我发现的内容使用预定义的分词器和其他部分组合在一起。没有可以满足我需要的选项。
你知道如何实现吗?
我唯一想到的是创建一个重复的数据库列,并将原始列的重复值放入删除不需要的字符。然后在这两个字段中搜索。
示例:
- 人名:齐默尔曼
- 搜索词:齐默尔曼
这个搜索词应该能找到那个人。
PS: 不能使用模糊搜索,因为在我的情况下它弊大于利,并找到我不想要的结果。
感谢任何建议。
我认为 pattern-replace token filter 可以。
只需将 pattern
参数设置为 "(.)\1+"
("any character followed by the same character at least once") 并将 replace
参数设置为 ""
("that character, but only once").
当 copy/pasting 这些到 Java 代码时要小心:反斜杠很重要。
注意我不确定这个正则表达式的性能。通常我宁愿使用 ngram 过滤器,但由于您不想要模糊搜索...
另请注意,您仍然会得到误报:搜索 "Zimmermann",没有任何拼写错误,可能 return 结果列表中名为 "Zimermann" 的人比实际"Zimmermann".
解决或至少缓解此问题的一种常见解决方案是利用评分。只需按分数(相关性)对结果进行排序,并精心设计查询,以便精确匹配获得更好的分数。
例如,您可以为人名添加两个字段:"name_exact",分析器不应用模式替换谓词,"name_fuzzy",分析器应用模式替换谓词。
然后在Hibernate Search中,构建一个布尔谓词,有两个"should"子句”:每个字段一个。精确匹配自然会得到更高的分数,并会上升到结果列表的顶部。
我正在将 Hibernate Search 与 Elasticsearch 结合使用,我需要为没有连续重复字符的搜索生成令牌。我检查了 Elasticsearch 的文档,但找不到任何可以满足我需要的东西。我找到了一些关于自定义分析器的信息,但总是根据我发现的内容使用预定义的分词器和其他部分组合在一起。没有可以满足我需要的选项。
你知道如何实现吗?
我唯一想到的是创建一个重复的数据库列,并将原始列的重复值放入删除不需要的字符。然后在这两个字段中搜索。
示例:
- 人名:齐默尔曼
- 搜索词:齐默尔曼
这个搜索词应该能找到那个人。
PS: 不能使用模糊搜索,因为在我的情况下它弊大于利,并找到我不想要的结果。
感谢任何建议。
我认为 pattern-replace token filter 可以。
只需将 pattern
参数设置为 "(.)\1+"
("any character followed by the same character at least once") 并将 replace
参数设置为 ""
("that character, but only once").
当 copy/pasting 这些到 Java 代码时要小心:反斜杠很重要。
注意我不确定这个正则表达式的性能。通常我宁愿使用 ngram 过滤器,但由于您不想要模糊搜索...
另请注意,您仍然会得到误报:搜索 "Zimmermann",没有任何拼写错误,可能 return 结果列表中名为 "Zimermann" 的人比实际"Zimmermann".
解决或至少缓解此问题的一种常见解决方案是利用评分。只需按分数(相关性)对结果进行排序,并精心设计查询,以便精确匹配获得更好的分数。
例如,您可以为人名添加两个字段:"name_exact",分析器不应用模式替换谓词,"name_fuzzy",分析器应用模式替换谓词。 然后在Hibernate Search中,构建一个布尔谓词,有两个"should"子句”:每个字段一个。精确匹配自然会得到更高的分数,并会上升到结果列表的顶部。