弹性搜索的最佳同义词方法是什么?

时间:2015-10-21 03:22:43

标签: elasticsearch

我正在使用弹性搜索为产品目录中的颜色实现同义词查询,我一直在请一些顾问使用ES同义词功能来实现它。

他们告诉我颜色可能有数百个同义词(白色:象牙色,奶油色,腻子色等),我们应该在操作数据库中进行映射。我不相信。如果我们在查询时有一个白色的100个同义词列表,那真的会有巨大的性能影响吗?如果这很慢,那么在索引文档时是否会进行同义词映射可以避免问题?

顾问希望我们反向进行映射,为我们的主数据库中的项目分配标准颜色,然后将其传递给ES。我不想让他们了解我们的架构/基础设施,只是让他们在ES中旋转他们已经知道如何做的旋钮。

我是否天真地认为我们可以这样做?用标准颜色装饰或操作数据库真的要走了吗?

1 个答案:

答案 0 :(得分:4)

我这样做的方法是定义一个同义词文件,如文档here中所述并维护该文件。

使用这个我创建自定义标记过滤器并在索引时使用它们。 如果您在查询时执行此操作,可能不会产生巨大的性能损失,但最好在索引时执行此操作。查询时的响应时间会更好。

关于你的数据库,我不知道你的架构,我不知道为什么他们说你需要把同义词放在那里。正如您在上面提供的链接中所看到的,您可以定义一个简单的文本文件,其中包含以下内容:

ivory, creme, putty => white
...

这意味着,对于在索引编制时找到的任何ivorycremeputty,ES实际上会对white进行索引,就是这样。

分析仪看起来像这样:

       "analyzer" : {
            "synonym" : {
                "tokenizer" : "whitespace",
                "filter" : ["synonym"]
            }
        },
        "filter" : {
            "synonym" : {
                "type" : "synonym",
                "synonyms_path" : "analysis/synonym.txt"
            }
        }

,具体取决于您要运行的查询以及匹配查询时间所需的内容,您可以定义index_analyzersearch_analyzer,使用{{3所以,对于“正确”解决方案,需要查看更多变量,而不仅仅是您提到的内容。 在我上面的方法中,我基本上在索引时将所有“white”的同义词都相等。但是,考虑到你想要运行的查询,也许你不需要这个。

总结:

  • 我不明白为什么颜色需要保存在数据库中,它们可以很好地在文本文件中指定,如上所示。也许我没有您用例的所有细节。
  • 最终解决方案可能涉及分析查询本身的输入文本或在索引时分析文本,或两者兼而有之。这一切都取决于您的具体用例和您的疑问。
  • 测试真实数据和实际数量的各种解决方案,并比较您获得的性能。
  • 通常,同义词方法是在索引时,但不一定,这取决于用例。