【问题标题】:SOLR - how to highlight exact phrases for wildcard searching resultsSOLR - 如何突出显示通配符搜索结果的确切短语
【发布时间】:2014-11-09 00:35:08
【问题描述】:

这是我在架构中声明的字段类型:

<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 只会显示匹配通配符的文档。但重点是:

"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. \n\n \n\nTEST. \n\n\n</em>"]},
    "25353":{
      "text_dsc":["<em>14276|\nDzień dobry -  dokument testowy. \n\n \n\nTEST. \n\n\n</em>"]},
    "26693":{
      "text_dsc":["<em>14276|\nDzień dobry -  dokument testowy. \n\n \n\nTEST. \n\n\n</em>"]}}}

如您所见,查询字符串是 dobry,但整个字段都被突出显示。为什么?如果我使用上面提到的 solr.EdgeNGramFilterFactory ,相同的查询突出显示是正确的,但搜索不正确(总是通配符)

【问题讨论】:

  • 您能否发布一个示例查询,尤其是突出显示参数?
  • 问题已更新。查询由 solr webadmin 界面生成。

标签: solr wildcard highlight


【解决方案1】:

使用 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 工厂之间的区别在这个问题中有很好的解释: difference between StandardTokenizerFactory and KeywordTokenizerFactory in SoLR

更新

在两个不同的字段中索引 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。

【讨论】:

  • 抱歉,它不能正常工作。它总是将结果作为子词重新出现。例如:title:Keyword* 和 title:Keyword 返回相同的结果。这是不可接受的。标题:关键字不应该返回任何东西,因为没有通配符
  • see keyword* 表示在标题中搜索关键字,其余可以是任何内容,另一方面,如果您搜索关键字,则如果标题包含关键字,则它是搜索结果的一部分。逻辑上两者都会返回同样的结果。外汇:如果您搜索 keywd 则不会显示任何结果,如果您搜索 keyw**d 则它将匹配包含介于两者之间的任何结果的结果。如果我错了,请纠正我。
  • 通配符对我来说不是目的。示例字段内容“一,二”。查询“一”不应返回任何内容,因为它与短语“一,二”不匹配。但是查询“One*”应该返回结果,因为它表示“One”和它之后的任何文本。使用您的解决方案,两者都返回相同并且是错误的。
  • 要清楚 - 我需要带有通配符的 SQL LIKE 语法的完全等价物。 Substrig,不关心字符串内容。
猜你喜欢
  • 2013-10-16
  • 1970-01-01
  • 2015-12-25
  • 2013-12-15
  • 1970-01-01
  • 1970-01-01
  • 2011-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多