我的问题与此处讨论的基本相同:Solr wildcard query with whitespace,但这个问题没有得到解答。
我在名为“brand”的字段的过滤器查询中使用通配符。
当品牌名称中有空格时,我遇到了麻烦。例如,当我说fq = {!tag = brand}品牌:Lexing * n时,过滤品牌“Lexington”就可以了。然而,像“Athentic Models”这样的多字品牌会引发问题。似乎必须在名称周围加上双引号。
当有“s,* s什么都不做,即品牌:”Athentic Mode *“或品牌:”Lexingt *“,什么都不匹配。没有双引号,它可以说品牌: Authen *,没有引号,没有空格,并且与真实模型相匹配。但是一旦品牌名称中包含空格,它似乎只在匹配时将字符串视为第一个空格。
品牌字段属于
类型<fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/>
根据我的理解,这不是空格标记。但是,它使用来自空白标记化字段的copyField填充。
我可以做些什么来阻止Solr在不使用双引号的情况下对过滤器查询进行标记?
答案 0 :(得分:13)
就像罗布在回答中说的那样,我发布了an answer on my own关于他所关联的问题。
您需要做的只是逃避查询中的空格(例如,customer_name:Pop *Tart
- &gt; customer_name:Pop\ *Tart
)。
根据我的经验,无论你在哪里放置通配符,这种方法都可以工作,这可以通过Solr声称的方式来支持:
customer_name:Pop\ *Tart
解析为:
customer_name:Pop *Tart
答案 1 :(得分:1)
尝试将类型从字符串更改为类似文本的内容。字符串类型未标记化,因此当字符串字段中有空格时,它将尝试匹配您的查询,包括字段中的空格。
在默认架构文件中,您可以在字符串字段类型
上方看到此行<!-- The StrField type is not analyzed, but indexed/stored verbatim. -->
使用文本类型可以解决您的问题,例如text_general或类似问题。
答案 2 :(得分:0)
我在原始问题Solr wildcard query with whitespace
上添加了一个可能的解决方案请注意,这仅适用于尾随通配符。我知道这个问题的例子在字符串中使用了通配符,但它可以用来回答问题的具体情况。
基本上相当于使用FieldQParserPlugin查询解析器。查看我在原始问题上的帖子了解更多细节,这样我就不会因为重复自己而感到鄙视。