我正在使用弹性搜索为产品目录中的颜色实现同义词查询,我一直在请一些顾问使用ES同义词功能来实现它。
他们告诉我颜色可能有数百个同义词(白色:象牙色,奶油色,腻子色等),我们应该在操作数据库中进行映射。我不相信。如果我们在查询时有一个白色的100个同义词列表,那真的会有巨大的性能影响吗?如果这很慢,那么在索引文档时是否会进行同义词映射可以避免问题?
顾问希望我们反向进行映射,为我们的主数据库中的项目分配标准颜色,然后将其传递给ES。我不想让他们了解我们的架构/基础设施,只是让他们在ES中旋转他们已经知道如何做的旋钮。
我是否天真地认为我们可以这样做?用标准颜色装饰或操作数据库真的要走了吗?
答案 0 :(得分:4)
我这样做的方法是定义一个同义词文件,如文档here中所述并维护该文件。
使用这个我创建自定义标记过滤器并在索引时使用它们。 如果您在查询时执行此操作,可能不会产生巨大的性能损失,但最好在索引时执行此操作。查询时的响应时间会更好。
关于你的数据库,我不知道你的架构,我不知道为什么他们说你需要把同义词放在那里。正如您在上面提供的链接中所看到的,您可以定义一个简单的文本文件,其中包含以下内容:
ivory, creme, putty => white
...
这意味着,对于在索引编制时找到的任何ivory
,creme
,putty
,ES实际上会对white
进行索引,就是这样。
分析仪看起来像这样:
"analyzer" : {
"synonym" : {
"tokenizer" : "whitespace",
"filter" : ["synonym"]
}
},
"filter" : {
"synonym" : {
"type" : "synonym",
"synonyms_path" : "analysis/synonym.txt"
}
}
但,具体取决于您要运行的查询以及匹配查询时间所需的内容,您可以定义index_analyzer
和search_analyzer
,使用{{3所以,对于“正确”解决方案,需要查看更多变量,而不仅仅是您提到的内容。
在我上面的方法中,我基本上在索引时将所有“white”的同义词都相等。但是,考虑到你想要运行的查询,也许你不需要这个。
总结: