【问题标题】:Elasticsearch "Did you mean" functionalityElasticsearch“你的意思是”功能
【发布时间】:2019-02-05 14:59:06
【问题描述】:

我一直在为电子商务系统实施 Elasticsearch 解决方案,在该系统中,我使用了“建议”一词来尝试创建类似“您是说……”的功能

对于拼写错误,它的效果非常好

例如,如果我搜索 hampster,那么它会返回提示正确的拼写 hamster,这正是我想要的

当我搜索 food 之类的内容时,问题出现了,它返回提示 fold,我不希望它这样做

我想要解决的是,如果 Elasticsearch 内置了一些东西,让我可以看到 food 是一个不需要建议的有效术语

不确定这是否有用,但这是我的查询和响应 (PHP)

Array
(
[suggest] => Array
    (
        [spell_check] => Array
            (
                [text] => food
                [term] => Array
                    (
                        [field] => name
                    )

            )

    )

)


Array
(
[took] => 1
[timed_out] => 
[_shards] => Array
    (
        [total] => 5
        [successful] => 5
        [skipped] => 0
        [failed] => 0
    )

[hits] => Array
    (
        [total] => 0
        [max_score] => 0
        [hits] => Array
            (
            )

    )

[suggest] => Array
    (
        [spell_check] => Array
            (
                [0] => Array
                    (
                        [text] => food
                        [offset] => 0
                        [length] => 4
                        [options] => Array
                            (
                                [0] => Array
                                    (
                                        [text] => fold
                                        [score] => 0.75
                                        [freq] => 1
                                    )

                                [1] => Array
                                    (
                                        [text] => feed
                                        [score] => 0.5
                                        [freq] => 4
                                    )

                                [2] => Array
                                    (
                                        [text] => four
                                        [score] => 0.5
                                        [freq] => 1
                                    )

                            )

                    )

            )

    )

)

【问题讨论】:

  • 信息不够,你应该显示一些代码。但我认为问题出在你的 sql 中。你应该更新 sql.检查此链接stackoverflow.com/a/14908166/4459647 您应该在搜索项目的末尾给出 %。
  • 问题中没有提到 SQL - 它纯粹是 Elasticsearch。

标签: php elasticsearch


【解决方案1】:

这实际上是预期的行为,因为它可以解决可能的拼写错误。有一个与返回的建议值相关的分数,并且返回了多个项目。在您的情况下,假设您的数据库中有与食物相关的数据,对食物的查询将返回结果。我不确定您是否也在命中的情况下(或仅使用 ES 作为某种建议服务)返回结果,但您的逻辑可以,例如,仅在没有返回结果的情况下提出建议。您还可以看到“feed”被返回但分数较低,因为我假设还有一个 levenshtein 距离应用于计算最终分数。

【讨论】:

  • 我也确实使用 Elasticsearch 来执行实际搜索,但问题是我的主要搜索使用“模糊性”,所以即使拼写错误仍然会返回结果,所以我无法使用它来确定它是否无效或不是。我想我可以只在 1 个字段上运行一个单独的、非模糊的搜索,这应该很好而且很快,并使用它来确定是否显示建议。我得试验一下。感谢您的回复
  • 没问题。最简单,当然也是最不“昂贵”的方法是返回一个列表——您可以限制为前两三个建议。如果您在示例中运行similar_text 或levenshtein PHP 函数,您会发现food 和fold 更相似。另一种选择是使用 NLP 库并设置一些规则来确定您将从数组中提取的内容。那里涉及一些工作,您可能也不总是得到您期望的结果。
猜你喜欢
  • 1970-01-01
  • 2010-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多