【问题标题】:Make Solr ignore a trailing slash?让 Solr 忽略斜杠?
【发布时间】:2019-06-25 01:27:50
【问题描述】:

我有一个索引字段url,其中我的一些文档在url 字段的末尾有一个斜杠,其他的则没有。我想在忽略斜杠的同时在 Solr 中查询该字段,以便所有匹配的结果都返回,无论它们末尾是否有斜杠。

例如,如果我发送查询:q=url:https://www.test.com/api/v1/test/ 我想取回任何具有https://www.test.com/api/v1/test/https://www.test.com/api/v1/testurl 字段的文档。

同样,如果我发送不带斜杠的查询,我希望得到与上面相同的结果(url 带有 OR,不带斜杠)。

如何做到这一点?我知道 Solr 通配符功能,但我不想忽略任何结束字符(例如,url:https://www.test.com/api/v1/test? 不应返回带有urlhttps://www.test.com/api/v1/test 的文档)。我只想要一个斜杠的这种通配符效果。

如果有帮助,我在 Solr 4 上(是的,我知道它很旧)。

【问题讨论】:

    标签: solr lucene


    【解决方案1】:

    您可以为此使用PathHierarchyTokenizer。另外,您还可以在不需要通配符的情况下搜索部分 URL。

    例如q=url:www.test.com 也会匹配索引 URL。

    这需要您的 schema.xml

    中有合适的 fieldType
    <fieldType name="url" class="solr.TextField" positionIncrementGap="100">
      <analyzer>
        <tokenizer class="solr.PathHierarchyTokenizerFactory" delimiter="/"/>
        <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>
    

    然后添加或更改文档的字段定义以使用 url fieldType,也在 schema.xml

    <field name="url" type="url" indexed="true" stored="true"/>
    

    【讨论】:

    • 这更接近我正在寻找的东西(一个 Tokenizer 或类似的东西),但我不希望 q=url:www.test.com 匹配像 https://www.test.com/api/v1/test/ 这样的索引 URL。有没有办法修改这个 Tokenizer 只忽略斜杠,没有别的?
    • 不,我不这么认为。
    【解决方案2】:

    我可能会在索引时使用正则表达式替换,并将 ^(.*)(?:\/)?$ 替换为 $1...

    将这些作为输入:

    url:https://www.test.com/api/v1/test?
    url:https://www.test.com/api/v1/test/
    url:https://www.test.com/api/v1/test
    

    它应该存储:

    url:https://www.test.com/api/v1/test?
    url:https://www.test.com/api/v1/test
    url:https://www.test.com/api/v1/test
    

    如果您随后在查询中执行相同的替换,您的查询应该符合预期:带有或不带有斜杠的查询将匹配带有或不带斜杠的存储 URL。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      相关资源
      最近更新 更多