安装弹性。设置索引。但在请求中有些奇怪。我不明白为什么搜索不起作用。
我在 ruby 中使用 lib 发出请求,并将其归咎于它,但是当我嗅探请求时,我意识到问题出在 elastic 本身。是的,这甚至不是问题,而是一项功能。
prod = Post.search "ра", fields: [:title] // На выходе n-элементов
prod = Post.search "разд", fields: [:title] // На выходе 0-элементов
prod = Post.search "раздел", fields: [:title] // На выходе n-элементов
最有可能的是,您需要在某个地方找到可以改进搜索的设置。
这很可能是分析器的行为。ES 使用比通常的精确匹配稍微复杂的搜索方案:
我怀疑这是问题所在——在 ES 中有“ra”和“section”标记,但没有“section”标记。
最有可能的是,关键点正是在当前分析器搜索时将请求拆分为哪些标记。要检查这一点,您需要查看匹配的文档标记和请求标记:
* 如果搜索使用默认索引分析器以外的分析器 - 很可能问题并不暗示这一点 - 可以在字段中指定
"analyzer"* 文档标记可以直接从 elasticsearch获得,但这有点复杂
如果您使用了所有默认设置,那么您将拥有一个标准分析器,它(至少对我而言)将给出以下结果:
(此外,我能够实现对最后两个查询的搜索,但即使有异常大的模糊性,ES 也拒绝通过“ra”找到我任何东西,这让我不得不承认,要么你仍然有一个非标准的分析器,或者我完全忘记了弹性)
之后,您可以使用 explain API 准确查看文档如何匹配或不匹配:
* 直接请求可能会有所不同,具体取决于您的图书馆
通过这种方式,您可以自己找到这种行为的原因 - 从社区方面来看,这几乎是不可能的,直到您将相应的索引映射到 ES,在三个请求中的两个中匹配的文档,直接请求本身,它通过库和 ES 版本。然而,据我所知,这个问题背后特别需要自动完成——在这种情况下,你不需要在 ES 中搜索,而是建议完成——这是一个稍微不同的 ES 功能,是专门创建的用于自动完成实现。