21

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

q=location:los a*

我希望它与“los angeles”和“los altos”相匹配。像这样的查询:

q=los*

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

4

9 回答 9

36

我最近自己也遇到过这个问题,看来您需要做的就是避开查询中的空格。Solr 会将您的原始查询解释为如下所示:

location:los id:a*

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

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

location:los\ a*

然后它最终会被解析为:

location:los a*

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

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

于 2013-01-20T16:05:04.067 回答
6

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

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

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

于 2015-05-03T06:02:27.997 回答
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" OR "Smi*") 的检查,如果您使用第一个解决方案,您可能会按照以下方式考虑q=name:Bob%20Smi*

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

于 2013-01-12T23:32:44.713 回答
1

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

于 2012-04-05T07:22:16.487 回答
1

为我工作

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

于 2015-01-21T13:05:48.630 回答
0

查询(假设您有空格标记器): q=location:los a* 表示您使用单词“los”和以“a”开头的单词搜索文档

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

于 2012-04-05T07:29:53.663 回答
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>

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

于 2013-11-29T08:25:27.560 回答
0

我在我的项目中遇到了同样的问题。当我搜索一个单词和空格时,我没有得到结果。所以我在索引和查询时用连字符“-”替换了空格。下面是我曾经这样做的 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>
于 2016-08-18T09:36:32.267 回答
0

用过这个

q=location:los/ a*

代替

q=location:los a*
于 2020-03-24T06:52:25.483 回答