【问题标题】:Solr: Using a wildcard on a string with whitespaceSolr:在带有空格的字符串上使用通配符
【发布时间】:2012-09-04 22:10:55
【问题描述】:

我和这里讨论的问题基本相同:Solr wildcard query with whitespace,但是这个问题没有得到回答。

我在名为“品牌”的字段的过滤查询中使用了通配符。

当品牌名称中包含空格时,我遇到了麻烦。例如,当我说 fq={!tag=brand}brand:Lexing*n 时,过滤品牌“Lexington”效果很好。然而,像“Athentic Models”这样的多词品牌会引起问题。似乎必须在名称周围包含双引号。

当有 "s,*s 不做任何事情,即品牌:"Athentic Mode*" 或品牌:"Lexingt*",不会匹配任何东西。没有双引号,它可以说品牌: Authen*,没有引号和空格,这将匹配 Authentic Models。但是一旦品牌名称中包含空格,匹配时似乎只考虑到第一个空格的字符串。

brand 字段的类型为

<fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>

据我了解,这不是空格标记的。但是,它填充了来自空白标记化字段的 copyField。

我可以做些什么来阻止 Solr 在不使用双引号的情况下对过滤器查询进行标记?

【问题讨论】:

    标签: solr lucene wildcard


    【解决方案1】:

    就像 Rob 在他的回答中所说,我已经在他链接的问题上发布了 an answer on my own

    您需要做的就是转义查询中的空格(如customer_name:Pop *Tart --> customer_name:Pop\ *Tart)。 根据我的经验,无论您将通配符放在哪里,这种方法都有效,这得到了 Solr 声明的支持,例如:

    customer_name:Pop\ *Tart
    

    被解析为:

    customer_name:Pop *Tart
    

    【讨论】:

      【解决方案2】:

      尝试将类型从字符串更改为文本。字符串类型未标记化,因此当字符串字段中有空格时,它将尝试匹配您的查询,包括字段中的空格。

      在默认模式文件中,您可以在字符串字段类型上方看到这一行

      <!-- The StrField type is not analyzed, but indexed/stored verbatim. -->
      

      使用文本类型应该可以解决您的问题,例如 text_general 或类似的。

      【讨论】:

      • 我认为我确实想要一个非标记化的字段来存储品牌。我希望能够通过在过滤器查询中指定其全名(包括空格)来过滤品牌。
      • 我尝试在标记化字段上使用通配符,但它返回的匹配项过于宽松......就像只要求查询的第一个标记与索引中的标记匹配。
      • 当然,对将用于过滤或排序的字段使用字符串对性能有意义,但随后您将忽略空间问题..您可以做一些基准测试来检查性能差异字符串和文本字段..或者您可以尝试一些其他技巧,例如对字段的第 N 个字母或标记进行排序等等.. 我不确定您是否可以定义自定义字段,尽管它可能值得研究跨度>
      • 实际上,我并不担心性能。我发现对文本字段进行过滤查询会导致匹配不准确。例如,这为 fq:"My Brand" 产生了匹配,不仅像 "My Brand",而且像 "My Brand Foo" 和 "My Brand Bar" 等。我不完全理解这个字段的行为,但我相信它不会满足我的要求。我使用通配符的原因是,对于带有 TM 符号的品牌,由于编码,我们无法匹配它们。我想在查询中用通配符替换 TM,并与品牌的其余部分完全匹配。
      • 对于TM的东西,你可以使用变压器吗?您可以从字段中替换或删除它,然后您不需要使用通配符。为了匹配文本查询,我建议在 schema.xml 文件中播放分析器和过滤器。虽然我认为教程数量不够好。你也可以在这里发布你的问题:lucene.472066.n3.nabble.com/Solr-User-f472068.html 这是一个solr/lucene 社区的主要列表
      【解决方案3】:

      我在原来的问题Solr wildcard query with whitespace上添加了一个可能的解决方案

      请注意,这仅适用于尾随通配符。我知道这个问题示例在字符串中使用了通配符,但它可以回答问题的具体情况。

      基本上它相当于使用FieldQParserPlugin 查询解析器。查看我关于原始问题的帖子以了解更多详细信息,这样我就不会因为重复自己而受到嘲笑。

      【讨论】:

        猜你喜欢
        • 2012-06-13
        • 2012-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-14
        • 2014-08-30
        • 2011-03-09
        相关资源
        最近更新 更多