Solr:在带有空格的字符串上使用通配符

时间:2012-09-11 22:31:02

标签: solr lucene wildcard

我的问题与此处讨论的基本相同: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在不使用双引号的情况下对过滤器查询进行标记?

3 个答案:

答案 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查询解析器。查看我在原始问题上的帖子了解更多细节,这样我就不会因为重复自己而感到鄙视。