SOLR-如何突出显示通配符搜索结果的精确短语



这是我在模式中声明的字段类型:

<fieldType name="c_string" class="solr.TextField">
 <analyzer type="index">
  <tokenizer class="solr.KeywordTokenizerFactory"/>
  <filter class="solr.ASCIIFoldingFilterFactory"/>
  <filter class="solr.LowerCaseFilterFactory" />
  <filter class="solr.ReversedWildcardFilterFactory" />
 </analyzer>
 <analyzer type="query">
  <tokenizer class="solr.KeywordTokenizerFactory"/>
  <filter class="solr.ASCIIFoldingFilterFactory"/>
  <filter class="solr.LowerCaseFilterFactory" />
 </analyzer>
</fieldType>

我可以使用通配符进行搜索,没有任何问题。但我对高亮功能有一些问题。Solr突出显示整个短语,而不仅仅是匹配的短语。例如,我的搜索查询是title:Keyword*。所以solr将只显示与wilcard匹配的文档。但亮点是:

"title": [
        "<em>Keyword and the rest of title</em>"

但我想要:

"title": [
        "<em>Keyword</em> and the rest of title"

如果我像这样使用solr.EdgeNGramFilterFactory,这可以随心所欲地工作:

<fieldType name="text_general_edge_ngram" class="solr.TextField" positionIncrementGap="100">
   <analyzer type="index">
      <tokenizer class="solr.LowerCaseTokenizerFactory"/>
      <filter class="solr.EdgeNGramFilterFactory" minGramSize="2" maxGramSize="15" side="front"/>
   </analyzer>
   <analyzer type="query">
      <tokenizer class="solr.LowerCaseTokenizerFactory"/>
   </analyzer>
</fieldType>

如果我使用它,高亮显示是可以的,但通配符会被忽略。Solr总是像使用通配符一样进行搜索,title:Keyword title:Keyword*的工作原理相同——显然title:Keyword不应该匹配任何内容。

你有什么建议吗?

[已添加]示例查询:

select?q=text_dsc%3A*dobry*&rows=200&wt=json&indent=true&hl=true&hl.fl=text_dsc&hl.simple.pre=<em>&hl.simple.post=<%2Fem>

突出显示结果示例:

  "highlighting":{
    "25352":{
      "text_dsc":["<em>14276|nDzień dobry -  dokument testowy. nn nnTEST. nnn</em>"]},
    "25353":{
      "text_dsc":["<em>14276|nDzień dobry -  dokument testowy. nn nnTEST. nnn</em>"]},
    "26693":{
      "text_dsc":["<em>14276|nDzień dobry -  dokument testowy. nn nnTEST. nnn</em>"]}}}

正如您所看到的,查询字符串是dobry,但整个字段都高亮显示。为什么?如果我使用solr。EdgeNGramFilterFactory如上所述,具有相同的查询高亮显示是正确的,但搜索是不正确的(总是通配符)

使用StandardTokenizerFactory,您将获得所需的输出:

<fieldType name="c_string" class="solr.TextField">
 <analyzer type="index">
  <tokenizer class="solr.StandardTokenizerFactory"/>
  <filter class="solr.ASCIIFoldingFilterFactory"/>
  <filter class="solr.LowerCaseFilterFactory" />
  <filter class="solr.ReversedWildcardFilterFactory" />
 </analyzer>
 <analyzer type="query">
  <tokenizer class="solr.StandardTokenizerFactory"/>
  <filter class="solr.ASCIIFoldingFilterFactory"/>
  <filter class="solr.LowerCaseFilterFactory" />
 </analyzer>
</fieldType>

StandardTokenizerFactory和KeywordTokenizerFactory工厂之间的区别在这个问题中得到了很好的解释:SoLR 中StandardTokenizerFactory和KeywordTokenizerFactory的区别

更新

在两个不同的字段(如)中索引text_dsc

   <fieldType name="text_dsc" class="solr.TextField">
 <analyzer type="index">
  <tokenizer class="solr.KeywordTokenizerFactory"/>
  <filter class="solr.ASCIIFoldingFilterFactory"/>
  <filter class="solr.LowerCaseFilterFactory" />
  <filter class="solr.ReversedWildcardFilterFactory" />
 </analyzer>
 <analyzer type="query">
  <tokenizer class="solr.KeywordTokenizerFactory"/>
  <filter class="solr.ASCIIFoldingFilterFactory"/>
  <filter class="solr.LowerCaseFilterFactory" />
 </analyzer>
</fieldType>

<fieldType name="text_dsc_standard" class="solr.TextField">
 <analyzer type="index">
  <tokenizer class="solr.StandardTokenizerFactory"/>
  <filter class="solr.ASCIIFoldingFilterFactory"/>
  <filter class="solr.LowerCaseFilterFactory" />
  <filter class="solr.ReversedWildcardFilterFactory" />
 </analyzer>
 <analyzer type="query">
  <tokenizer class="solr.StandardTokenizerFactory"/>
  <filter class="solr.ASCIIFoldingFilterFactory"/>
  <filter class="solr.LowerCaseFilterFactory" />
 </analyzer>
</fieldType>

在您的搜索查询集中,hl.fl=text_dsc_standard.

最新更新