如何从 Solr 获得与以下 Mysql 查询相同的结果?

How to get same result as following Mysql query from Solr?

Mysql 查询:内部查询 returns 所有 attribute_value 包含 "man" 及其在属性值中的位置。外部查询按位置编号的降序对其进行排序。从而按顺序给出结果,其中 "man" 开始从第一个位置移动到后面的位置 Like

man
manager
aman
human
hanuman
assistant manager
indian institute of management

这是 SQL 查询:

SELECT f1.av
FROM (
    SELECT `attribute_value` av, LOCATE("man",LOWER(`attribute_value`)) po     
        FROM db_attributes WHERE `attribute_value` LIKE "%man%"
    ) f1 
ORDER BY f1.po

我想用 solr 来实现。现在我对如何实现这一目标一无所知。 Solr 加载了所有属性值。非常感谢帮助。

这个问题是关于如何进行非左锚定的部分字符串匹配的。这可能是对 Solr(和任何索引)提供和不提供的一些误解。

您可以在 mysql 中执行此查询,因为它是在执行时 计算的 ,代价是检查每一行。但是在 Solr 中尝试这个查询是不自然的,因为索引的全部意义在于最小化执行时的成本并且不触及每条记录。即,索引想要为给定的潜在输入预先计算一个子集。

考虑:您的两个基本 fieldTypestringtext。 String 只支持精确匹配。文本进行标记化和词干化。您要搜索“ingition”以匹配“ignite”吗?看来您没有,因为您没有将输入视为单词或词干,而是字符串。

在那种情况下,您可能需要查看 http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.EdgeNGramFilterFactory,它可用于生成给定标记的所有左锚定子字符串。通过使用第二个字段,您还可以让 EdgeNGramFilterFactory 生成右锚定子字符串(然后搜索两个匹配项)。但这与生成 所有可能的 子字符串不同,正如您的示例用法所建议的那样。

至于结果集顺序,您必须定义一个 相关性 来按您想要的方式排序。这可能意味着一个单独的字符串字段具有用于精确匹配的高分和用于匹配的原子化字段以较低的相关性。

简而言之,您可能不应该考虑在 Solr 中完全 重现这些特定的 mysql 查询。我会推动用例的澄清或重新定义(左或右锚定)。