没有 hl.q,Solr 突出显示无法工作
Solr Highlighting not working without hl.q
我正在使用 Solr 6.0
。我想使用 Solr
的 Highlighting
功能。
当我进行以下查询时,响应中的 highlighting
部分只有 ID(没有 &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
输出-
"highlighting": {
"id1": {
"data": ["<em>advertise</em>",
"<em>add</em>"
]
},
"id2": {
"data": ["<em>admin</em>",
"<em>addon</em>"
]
}
}
为什么要通过hl.q?有办法避免吗?
如果我想在 solrconfig.xml
中编写自定义 requestHandler
(qt)
那么我可以将 q 值传递给 hl.q
并以 *
作为前缀并且后缀类似于 hl.q=*$q*
.
我有以下 2 个字段 -
<field name="text" type="text_suggest" indexed="true" stored="false" multiValued="true"/>
<field name="data" type="lower" indexed="false" stored="true" multiValued="true"/>
以下是字段的定义-
<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>
以下是在2个字段中复制数据的方式-
<copyField source="somefield" dest="text" maxChars="30"/>
<copyField source="somefield" dest="data"/>
编辑 1
当我将 &hl.alternateField=data
添加到第一个查询时,多值字段中的所有值都会像正常搜索一样显示在 highlighting
部分中。如下所示 -
"highlighting": {
"id1": {
"data": ["advertise",
"not relevant",
"add"
]
},
"id2": {
"data": ["admin",
"addon",
"irrelevant"
]
}
}
将 EdgeNGram 过滤器添加到 lower 类型,它将匹配第一个示例。它不会匹配数据中的 "ad",因为它没有任何 NGram。
我正在使用 Solr 6.0
。我想使用 Solr
的 Highlighting
功能。
当我进行以下查询时,响应中的 highlighting
部分只有 ID(没有 &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
输出-
"highlighting": {
"id1": {
"data": ["<em>advertise</em>",
"<em>add</em>"
]
},
"id2": {
"data": ["<em>admin</em>",
"<em>addon</em>"
]
}
}
为什么要通过hl.q?有办法避免吗?
如果我想在 solrconfig.xml
中编写自定义 requestHandler
(qt)
那么我可以将 q 值传递给 hl.q
并以 *
作为前缀并且后缀类似于 hl.q=*$q*
.
我有以下 2 个字段 -
<field name="text" type="text_suggest" indexed="true" stored="false" multiValued="true"/>
<field name="data" type="lower" indexed="false" stored="true" multiValued="true"/>
以下是字段的定义-
<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>
以下是在2个字段中复制数据的方式-
<copyField source="somefield" dest="text" maxChars="30"/>
<copyField source="somefield" dest="data"/>
编辑 1
当我将 &hl.alternateField=data
添加到第一个查询时,多值字段中的所有值都会像正常搜索一样显示在 highlighting
部分中。如下所示 -
"highlighting": {
"id1": {
"data": ["advertise",
"not relevant",
"add"
]
},
"id2": {
"data": ["admin",
"addon",
"irrelevant"
]
}
}
将 EdgeNGram 过滤器添加到 lower 类型,它将匹配第一个示例。它不会匹配数据中的 "ad",因为它没有任何 NGram。