使用空格的Solr通配符查询

时间:2012-04-05 05:33:08

标签: solr wildcard

我有一个看起来像这样的通配符查询:

q=location:los a*

我想要它匹配“洛杉矶”和“洛杉矶alt”。像:

这样的查询
q=los*

工作得很好,但是一旦我添加空格,我就没有结果。我如何在通配符查询中使用空格?

8 个答案:

答案 0 :(得分:31)

我最近自己遇到过这个问题,看来您需要做的只是逃避查询中的空间。您的原始查询将被Solr解释为:

location:los id:a*

(假设“id”是您的默认搜索字段)

但是,如果您将查询编写为:

location:los\ a*

然后它最终会被解析为:

location:los a*

以上应该会产生您想要的结果(假设您的数据已正确编入索引)。

提示:弄清楚这一切很简单。只需将&debugQuery=on添加到您提交查询时使用的网址末尾,以查看Solr如何解析该网址。

答案 1 :(得分:1)

我可以建议使用solr前缀查询插件,如果你只使用后缀上的通配符那么http://lucene.apache.org/solr/4_0_0/solr-core/org/apache/solr/search/PrefixQParserPlugin.html

示例用法

http://localhost:8983/solr/collection/select?q={!prefix%20f=name}Bob%20Smi

将匹配“Bob Smith”或“Bob Smit”但不会转换为(“Bob”或“Smi *”)的检查,如果您使用了第{{1 }}

希望这对你或其他寻求简单解决方案的人有所帮助,因为在我发现这个问题之前,我正在撞墙几个小时!

答案 2 :(得分:0)

如果没有看到您的配置,我会说使用KeywordTokenizerFactory,因为您现在可能在空格上进行标记。

答案 3 :(得分:0)

查询(假设您有空白标记生成器): q =位置:洛杉矶* 表示您使用单词“los”和以“a”开头的单词

搜索文档

Solr(我知道的很多)无法确定一个单词(或术语)是否出现在另一个单词之前。

答案 4 :(得分:0)

我认为你应该像这样使用配置

  <fieldType name="text" class="solr.TextField" positionIncrementGap="100">
     <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory" />
        <filter class="solr.PatternReplaceFilterFactory" pattern="(\s+)" replacement=""   replace="all" />
    </analyzer>
  </fieldType>

并且您必须将搜索的输入关键字处理为删除空格

答案 5 :(得分:0)

对我工作

<fieldtype name="text_like" class="solr.TextField">
    <analyzer type="index">
        <tokenizer class="solr.NGramTokenizerFactory" minGramSize="3" maxGramSize="1000"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.LowerCaseTokenizerFactory"/>
    </analyzer>
</fieldtype>

和查询field:*some\ phrase*(在java文字中,需要以\\方式转义\。)

答案 6 :(得分:0)

我的项目遇到了同样的问题。当我一直在寻找一个单词以及空白时,我没有考虑结果。所以我在索引和查询时用连字符“ - ”替换了空格。下面是schema.xml snipet,我曾经这样做过:

<fieldType name="text_ci" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.NGramTokenizerFactory" minGramSize="2" maxGramSize="250"/>
<filter class="solr.LowerCaseFilterFactory"/>
  <filter class="solr.TrimFilterFactory" />
    <filter class="solr.PatternReplaceFilterFactory"
            pattern="([/\s+])" replacement="-" replace="all"
    />
</analyzer>
<analyzer type="query">
<tokenizer class="solr.EdgeNGramTokenizerFactory" minGramSize="2" maxGramSize="250"/>
<filter class="solr.LowerCaseFilterFactory"/>
 <filter class="solr.TrimFilterFactory" />
    <filter class="solr.PatternReplaceFilterFactory"
            pattern="([/\s+])" replacement="-" replace="all"
    />
</analyzer>
</fieldType>

答案 7 :(得分:0)

使用了

q=location:los/ a*

代替

q=location:los a*