Solr - 搜索单词后立即进行部分匹配(使用通配符)

时间:2014-09-15 15:13:51

标签: solr lucene

我有一个填充了文档的Solr索引,其中包含一个名为 issuer 的字段 有一个发行人= 第一个发行人的文件。

我正在尝试实现两个后续单词的匹配。第一个词需要完全匹配,第二个词需要部分匹配。

我想要实现的目标是:

  • 我搜索的内容如下:issuer:first\ iss*
  • 我希望它与“ first iss uer”
  • 相匹配

我尝试了以下解决方案但没有一个正在运行:

issuer:first\ iss*       -> returns nothing
issuer:"first iss"*      -> returns everything
issuer:(first iss*)      -> also returns "issuer first"

有没有人知道如何达到预期效果?

2 个答案:

答案 0 :(得分:3)

我的建议是在架构中添加基于shiringle过滤器的字段类型。以下是一个简单的定义:

<fieldtype name="shingle">
  <analyzer>
  <tokenizer class="solr.WhitespaceTokenizerFactory"/>
  <filter class="solr.ShingleFilterFactory" minShingleSize="2" maxShingleSize="5"/>
  </analyzer>
</fieldtype>

然后添加此类型的另一个字段,如下所示:

<field name="issuer_sh" type="shingle" indexed="true" stored="false"/>

在查询时,您可以发出以下查询:

issuer_sh:"first iss*"

shingleFilter从文本中创建n-gram标记。例如,如果issuer字段包含“first issue”,那么Solr将创建并索引以下标记:

first  
issue
first issue

答案 1 :(得分:1)

您无法在词组查询中使用通配符进行搜索。在不改变索引方式的情况下(请参阅@ ameertawfik的答案),标准查询解析器不提供执行此操作的好方法。但是,您可以使用surround query parser来搜索使用跨度。此查询将如下所示:

1N(first, iss*)

请注意,环绕查询解析器不会进行分析,因此1N(first, iss*)1N(First, iss*)将无法找到相同的结果。

您也可以直接使用lucene的SpanQueries构建此查询,当然,如:

SpanQuery[] queries = new SpanQuery[2];
queries[0] = new SpanTermQuery(new Term("issuer","first"));
queries[1] = new SpanMultiTermQueryWrapper(new PrefixQuery(new Term("issuer","iss")));
Query finalQuery = new SpanNearQuery(queries, 0, true);