Mysql Query:内部查询返回包含“man”的所有attribute_value及其在属性值中的位置。外部查询按位置编号的降序对其进行排序。从而以“man”开始从第一个位置移动到后一个位置的顺序给出结果,如
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加载了所有属性值。非常感谢帮助。
答案 0 :(得分:0)
这个问题是关于如何进行非左锚定的部分字符串匹配。这可能是对Solr(和任何索引)提供的内容以及它未提供的内容的一些误解。
您可以在mysql中执行此查询,因为它在执行时是计算,代价是检查每一行。但是在Solr中尝试此查询是不自然的,因为索引的整个点是在执行时最小化成本而不是触及每条记录。 I.E.,索引想要预先计算给定潜在输入的子集。
请注意:您的两个基本fieldType
为字符串和文字。字符串仅支持精确匹配。文本进行标记化和词干化。你想搜索“ingition”来匹配“点燃”吗?看来你没有,因为你没有将输入视为单词或词干,而是字符串。
在这种情况下,您可能希望查看http://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters#solr.EdgeNGramFilterFactory,它可用于生成给定标记的所有左锚定子串。通过使用第二个字段,您还可以让EdgeNGramFilterFactory生成正确的锚定子字符串(然后搜索两个匹配项)。但这与生成所有可能的子字符串不同,就像您的示例用法所示。
对于结果集顺序,您必须定义一个相关性,以您想要的方式排序。这可能意味着一个单独的字符串字段,其中精确匹配得分高,雾化字段用于匹配较低的相关性。
简而言之,您可能不应该考虑在Solr中重现这些特定的mysql查询完全。我会推动澄清或重新定义用例(左或右锚定)。