我有一个填充了文档的Solr索引,其中包含一个名为 issuer 的字段 有一个发行人= 第一个发行人的文件。
我正在尝试实现两个后续单词的匹配。第一个词需要完全匹配,第二个词需要部分匹配。
我想要实现的目标是:
issuer:first\ iss*
我尝试了以下解决方案但没有一个正在运行:
issuer:first\ iss* -> returns nothing
issuer:"first iss"* -> returns everything
issuer:(first iss*) -> also returns "issuer first"
有没有人知道如何达到预期效果?
答案 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);