Solr突出显示没有hl.q无法工作

时间:2016-05-27 22:50:01

标签: solr highlighting solr6

我正在使用Solr 6.0。我想使用Highlighting的{​​{1}}功能。

当我进行以下查询时,回复中的Solr部分只有ID(没有highlighting) -

&hl.q=data:*ad*

输出 -

http://<hostname>:<port>/solr/<core>/select?q=text:ad&fl=data&rows=10&hl=on&hl.fl=data&hl.preserveMulti=true&hl.mergeContiguous=true

当我进行以下查询时,我得到了所需的输出(使用"highlighting": { "id1": {}, "id2": {} } ) -

&hl.q=data:*ad*

输出 -

http://<hostname>:<port>/solr/<core>/select?q=text:ad&fl=data&rows=10&hl=on&hl.q=data:*ad*&hl.fl=data&hl.preserveMulti=true&hl.mergeContiguous=true

为什么我需要传递hl.q?有没有办法避免它?

如果我想在"highlighting": { "id1": { "data": ["<em>advertise</em>", "<em>add</em>" ] }, "id2": { "data": ["<em>admin</em>", "<em>addon</em>" ] } } 中编写自定义requestHandler (qt),那么我可以将q值传递给solrconfig.xml,并将hl.q作为前缀和后缀比如*

我有以下两个字段 -

hl.q=*$q*

以下是字段的定义 -

<field name="text" type="text_suggest" indexed="true" stored="false" multiValued="true"/>
<field name="data" type="lower" indexed="false" stored="true" multiValued="true"/> 

以下是在2个字段中复制数据的方式 -

<fieldType name="lower" class="solr.TextField" sortMissingLast="true" omitNorms="true">
    <analyzer>
         <tokenizer class="solr.KeywordTokenizerFactory"/>
         <filter class="solr.LowerCaseFilterFactory" />
    </analyzer>
</fieldType>
<fieldType name="text_suggest" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
         <tokenizer class="solr.KeywordTokenizerFactory"/>
         <filter class="solr.LowerCaseFilterFactory"/>
         <filter class="solr.EdgeNGramFilterFactory" minGramSize="1" maxGramSize="30"/>
         <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
    </analyzer>
    <analyzer type="query">
         <tokenizer class="solr.KeywordTokenizerFactory"/>
         <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
</fieldType>

编辑1

当我向第一个查询添加<copyField source="somefield" dest="text" maxChars="30"/> <copyField source="somefield" dest="data"/> 时,多值字段中的所有值都会显示在&hl.alternateField=data部分中,就像普通搜索一样。如下 -

highlighting

1 个答案:

答案 0 :(得分:1)

将EdgeNGram过滤器添加到 lower 类型,它将与第一个示例匹配。它不会匹配&#34; ad&#34;在数据中,因为它没有任何NGrams。