【问题标题】:How to get same result as following Mysql query from Solr?如何从 Solr 获得与 Mysql 查询相同的结果?
【发布时间】:2015-01-25 16:23:26
【问题描述】:

Mysql 查询:内部查询返回所有包含“man”的attribute_value 及其在attribute 值中的位置。外部查询按位置编号的降序对其进行排序。从而按照“人”开始从第一个位置移动到后面的位置的顺序给出结果喜欢

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 加载了所有属性值是什么意思?请告诉更多细节,显示你的 schema.xml
  • attribute_value 是示例中的字段名称。

标签: mysql solr


【解决方案1】:

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多