带有空格的Solr通配符查询



我有一个通配符查询,看起来像:

q=location:los a*

我希望它能与"洛杉矶"one_answers"洛杉矶"相匹配。类似以下查询:

q=los*

工作得很好,但只要添加空白,就不会得到任何结果。如何在通配符查询中使用空格?

我最近自己也遇到了这个问题,似乎你所需要做的就是逃离查询中的空间。Solr会将您最初的查询解释为:

location:los id:a*

(假设"id"是默认搜索字段)

但是,如果您将查询写成:

location:los a*

然后它将被解析为:

location:los a*

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

提示:弄清楚这一切很简单。只需在提交查询时使用的url末尾添加&debugQuery=on,即可查看Solr是如何解析它的。

使用复杂查询解析器解决问题的方法:

q={!complexphrase inOrder=true}location:"los a*"

要了解有关复杂短语查询解析器的更多信息,请查看此链接!https://cwiki.apache.org/confluence/display/solr/Other+Parsers#OtherParsers Complex语法查询Parser

如果您像以前一样只将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",但不会像使用q=name:Bob%20Smi* 中可能考虑的第一个解决方案那样转换为("Bob"或"Smi*")的检查

希望这能对你或其他寻找简单解决方案的人有所帮助,因为在我发现这个之前,我已经用头撞墙好几个小时了!

在没有看到您的配置的情况下,我会说使用KeywordTokenizerFactory,因为您现在可能对空白进行标记。

为我工作的

<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文本中,需要转义为\\)。

查询(假设您有空白标记器):q=位置:los a*意思是你用单词"los"和一个以"a"开头的单词搜索文档

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

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

  <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>

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

我在项目中遇到了同样的问题。当我搜索一个带有空格的单词时,我没有得到结果。因此,在索引和查询时,我用连字符"-"替换了空白。下面是我曾经做过的schema.xml狙击:

<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>

使用此

q=location:los/ a*

而不是

q=location:los a*

最新更新