10

我遇到的问题与此处讨论的问题基本相同:Solr wildcard query with whitespace,但没​​有回答这个问题。

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

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

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

品牌字段是类型

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

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

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

4

3 回答 3

14

就像 Rob 在他的回答中所说的那样,我已经就他所链接的问题自己发布了一个答案。

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

customer_name:Pop\ *Tart

被解析为:

customer_name:Pop *Tart
于 2013-01-20T16:12:11.647 回答
1

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

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

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

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

于 2012-09-12T01:37:28.657 回答
0

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

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

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

于 2013-01-12T23:37:51.010 回答