我是ElasticSearch的新手,但在过去的几天里一直在阅读它,试图提出"最佳"类型的搜索我的应用程序。我希望能够匹配多个词与多个结果,但也有部分词的结果。下面列出的是我目前正在使用的,它可以很好地找到所有输入的单词,例如"Michigan Creative VP"可以找到为Michigan Creative和VP Comm工作的人,但是当我搜索"管理"而不是"管理"时,什么也没有出现。
$params =
[
'index' => 'myindex',
'type' => 'person',
'body' =>
[
'from' => 0,
'size' => 500,
'query' =>
[
'fuzzy_like_this' =>
[
'_all' =>
[
'like_text' => $keywords,
'fuzziness' => 0.5,
],
],
],
]
];
我读过通配符,但看到人们说结果很慢,我不确定他们也考虑了搜索中的每个单词。有人能帮我指出正确的搜索配置,可以得到部分匹配。
几点思考
-
fuzzy_like_this查询是为类似这样的情况而构建的。基本上,它通常用于内容内推荐。这就是你要做的吗?对于更典型的搜索,我希望看到
match
或multi_match
查询。你试过这些吗? -
看起来文本正在被标记化,而fuzzy_like_this正在像传统搜索一样匹配精确的标记。例如
Michigan Creative VP'找到了为Michigan Creative和VP Comm工作的人,但是当我搜索'manage'而不是'management'时,什么也没有出现。
似乎向我表明文档包含术语[vp]和[comm],并且您的查询匹配,因为查询中的[vp]是匹配的。其他文档匹配,因为[michigan]和[creative]是完全匹配的
-
您的模糊度似乎不够高,无法匹配查询
manage
和management
。检查下面的公式,您可以计算出允许在搜索结果中进行多少次编辑:length(term) * (1.0 - fuzziness)
在这里是指
length(manage) * 0.5 == 6 * 0.5 or 3
似乎允许最多3个字符的编辑,
management
添加了4个字符
一些更大的图片指针:
-
仅通过编辑距离进行搜索可能无法实现搜索引擎的核心优势。当您获取文本并使用分析过程将其规范化为标记时,搜索引擎将得到更好的使用。我建议把这篇文章作为入门。我们在我的书《相关搜索
》的第四章中也详细讨论了这一点。 一旦你理解了分析,一个更好的解决
management
和manage
匹配的一般问题的方法可能是词干提取,它在尝试匹配之前将术语减少到它们的根形式。根据你对搜索匹配规则的看法,听起来你可能想要设置测试用例,并使用测试驱动的方法来搜索。