【问题标题】:In SOLR, how can I query to find an indexed keyword inside a user provided search query?在 SOLR 中,如何查询以在用户提供的搜索查询中找到索引关键字?
【发布时间】:2013-03-19 17:22:38
【问题描述】:

我正在运行 SOLR 3.6,并且有已索引标签的文档。当用户输入搜索词组时,我希望能够找到带有包含在该查询中的标签的文档。

例如,用户搜索“任何带有船标签的文档”将匹配带有“船”作为标签的文档。

我知道您可以进行通配符搜索,但我需要将通配符应用于 solr 字段,而不是搜索查询。

与此等效的 MySQL 是:

SELECT * FROM `documents` WHERE "Any document that has boats tagged" LIKE 'CONCAT('%', `document`, '%');

所以我需要一个允许这种类型查询的 SOLR 工厂:

*document*:"Any document that has boats tagged"

【问题讨论】:

    标签: search solr jetty contains


    【解决方案1】:

    如果 Solr 中的 tags 字段在索引时间和查询时间都是带有 LowerCaseFilterFactory 的多值文本字段,那么您可以简单地发出以下查询:

    q=tags:(Super fast boats)
    

    (我在这里更改了您的示例。)这将为您提供首先具有所有 3 个标签(如果有)的文档,然后是具有 2 个标签(如果有)然后是 1 个标签的文档。

    这是假设在您的 schema.xml 中您有 <solrQueryParser defaultOperator="OR"/>。如果您有 AND,则需要使用 OR 分隔单词,例如:

    q=tags:(any OR document OR that OR has OR boats OR tagged)
    

    (您可能还希望对标签和查询使用词干提取以匹配更多标签,但这是您需要试验和决定的事情。)

    【讨论】:

    • 这很有帮助,但是如果标签字段可以是多个单词怎么办。因此,“超级快船”的查询应该匹配带有“超级快”和“快船”标签的文档,但它不应该匹配带有“快”标签的文档。
    • 那么您需要在调用 Solr 之前构造 Solr 查询,例如:q=tags:(("super fast" OR "fast boats") AND -fast)。这意味着您的应用程序知道所有标签名称,这可能不可行。另一种方法是查看返回文档的分数(添加请求参数fl=*,score 以查看分数)。匹配最多标签的文档得分最高,只有一个标签匹配的文档得分最低。
    猜你喜欢
    • 2016-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-01
    • 2020-11-21
    • 1970-01-01
    相关资源
    最近更新 更多