Solr:确定任意字符串是否包含特定文本

时间:2016-02-16 12:58:38

标签: solr

我正在尝试使用Solr来解决这个问题:

在专用核心中,我加载了一些特定的文本,在schema.xml中定义如下:

...
<field name="pieceOfText" type="text_general" indexed="true" required="true" stored="true" multiValued="false"/>
...

这些是pieceOfText的示例: “这是一些文字” “这是文字” “这是其他文字”

现在,给定任意查询字符串,例如“这是一个任意字符串中的一些文本”,我希望Solr只返回我的pieceOfText 其中100%与查询字符串的连续部分匹配。对于上面的示例,它将仅返回“这是一些文本”,而“这是文本”和“这是其他文本”不应出现在结果中,因为它们不会100%数学与respet到查询字符串。

我已经尝试过mm =“100%”,但似乎它对我不起作用,因为它迫使edismax找到一个与100%的查询字符串匹配的pieceOfText,(对吧?)

我定义了这个reqestHandler:

  <requestHandler name="/select" class="solr.SearchHandler">
     <lst name="defaults">
       <str name="defType">edismax</str>
       <str name="df">pieceOfText</str>
       <int name="qs">0</int>
       <str name="fl">pieceOfText,score</str>
     </lst>
  </requestHandler>

任何建议都将非常感谢! 谢谢大家 斯特凡诺

1 个答案:

答案 0 :(得分:0)

通常,短语搜索用于在长文本中找到小短语(查询)(检索/ UoR单位)。在您的情况下,UoR是一个小短语,您的查询是一个长文本。

对于倒排索引,这是一个难题。

  1. 您可以编写自己的查询解析器(使用SpanPositionCheckQuery作为起点)或...

  2. 您可以将查询扩展为很多短语,例如n-gram搜索:

    • 添加一个令牌<start>作为您所有UoR的第一个令牌,并添加一个令牌<end>作为最后一个令牌。
    • 而不是使用此OR子句查询“A B C”:
      1. <start> A <end>
      2. <start> B <end>
      3. <start> C <end>
      4. <start> A B <end>
      5. <start> B C <end>
      6. <start> A B C <end>
  3. 请勿对您的UoR(KeywordTokenizer)进行标记,并使用ShingleFilter进行查询。