【问题标题】:Creating a usable search for filtering创建一个可用的过滤搜索
【发布时间】:2018-12-06 05:58:10
【问题描述】:

我对搜索问题并不精通。 我只真正使用过类似查询和 in 等的 sql。

我需要创建一个搜索来过滤文件和产品。所以给定文件名: company_launch 2019.png

如果您按照预期开始搜索以下任何内容,则会返回该文件:

  • com
  • 2019
  • 启动
  • 兰奇
  • _launch
  • .png

这是一个 laravel php 网站。我看过https://github.com/teamtnt/tntsearch 但是我无法让它比确切的单词/减去几个字符的单词更好地匹配。还有更多的边缘情况意味着上述预期行为不起作用。

我现在正在查看elastic search。我对 ngrams 的概念以及它与搜索单词的一部分有什么关系有一个基本的了解,但是我不确定这个 + 模糊匹配是否足以实现这个搜索。到目前为止,我只能像以前一样获得完全匹配。

谁能帮我指出正确的方向以实现您所期望的搜索?

【问题讨论】:

  • 你试过 Algolia 吗? algolia.com
  • 感谢 Anan,但这与我遇到的问题相同。即有一个标题为“Aliquid commodi provident itaque quis velit”的记录。但是使用“液体”搜索此内容不会返回任何内容
  • 使用 ES 你可以实现这一点,使用你的标记器和字段映射设置。首先看看NGram tokenizer 的工作原理,然后尝试使用Multiple fields 创建一个具有不同分析器/标记器配置的字段,这将帮助您找到解决问题的最佳方法。
  • 嗨@jordivador 谢谢,我已经开始设置了。我不确定如何让 ngrams 正常工作。例如 event jack, event jon, event_jack 如果您使用 event jack 搜索它,我希望它以 event jack, event_jack, event_jon 的顺序显示

标签: laravel elasticsearch search fuzzy-search n-gram


【解决方案1】:

TNTSearch 有一个很好的功能,可以实现类似于 sublime 文本中的搜索栏的功能。通过安装该软件包,您将可以立即访问fuzzyMatchFromFile 功能。

让我们考虑这样一种情况:您有一堆图像位于一个文件夹中,并且您想要添加搜索功能。

首先,您需要将目录列表保存到一个文件中。这可以通过一个简单的命令来完成,例如:

find ./path/to/image/folder -type f -follow -print > image-files.txt

image-files.txt每个图像将在自己的一行

接下来,您将提供此文件作为 fuzzyMatchFromFile 函数的第二个参数

$query = "someword";
$path = "/path/to/image-files.txt";
$searchResults = fuzzyMatchFromFile($query, $path);

$searchResults 数组将包含文件的路径和分数

如果您有一个名为 beautiful-image.png 的文件,您也可以使用 btfl-img.png 搜索和找到它。

对于多达 10 万条记录,上述方法的运行速度非常快。

算法检查查询和文件名之间是否存在common subsequence,如果存在,它会计算两个向量之间的cosine similarity(文件名和查询字符串都转换为向量)。此外,如果一个子字符串 存在,它会增加分数

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多