我找不到更好的标题,我希望以后如有可能,请在以后更改它。

我的问题:

我有一个音乐艺术家数据库。它们看起来像这样:“博士特技博士”,“阿姆特博士”,“德姆特博士ll cool j”,“德勒特博士”,“德勒特技博士”和“灰白色”。 。我们只有两个字段:id和name。

在默认的架构Solr核心上,我运行以下查询:“q = dr。dre”,结果正常,但并不完美,如下所示:

  • 博士dre壮举。 akon
  • 阿姆博士dre
  • 博士dre壮举。 ll cool j
  • 博士dre
  • ...

  • 请注意,他们得到的分数完全相同。

    我想要的是首先得到“dr。dre”,然后是所有其他结果,像这样:
  • 博士dre <
  • 阿姆博士dre
  • 博士dre壮举。 ll cool j
  • 博士dre壮举。 akon
  • ...

  • 我该如何实现? (过滤器,标记器,复制字段等。ist没关系。我无法在solr中更改代码,就像在其他论坛上看到的那样)

    谢谢。

    最佳答案

    有两种不同的方法可以使“dr。dre”结果首先出现。对于冗长的答案,我深表歉意,但正如在Solr中经常发生的那样,答案取决于您的优先级和需求。



    规范

    规范是一种灵活的选项,可以很自然地与Solr一起使用。您的name字段可能应该具有一个type值,该值映射到fieldType条目。 fieldType可能应该具有class="solr.TextField",并且不应具有omitNorms="true" 。除非您在名称字段上明确省略规范,否则Solr在计算文档分数时会考虑多少名称与您的搜索词匹配以及您的搜索词与名称匹配的次数。 “dr。dre”将获得最高分,因为名称中100%的单词与您的搜索匹配。

    您可以阅读有关规范的信息,并在the Solr documentation wiki上或在下载的Solr文档中为特定的Solr版本看到良好的常规文本fieldType配置。依靠规范的优势在于,除了易于实现之外,它们是渐进的。因此,尽管“博士博士”将是最相关的记录,并且其名称的100%与您的搜索匹配,但“博士生博士”比“博士生博士的整个列表”更为相关,因为搜索字词在名称中占较大比例。

    完全符合

    精确匹配在Solr中是一个复杂的问题,主要是因为存在不同程度的“灵活性”,而在现实生活中很少需要真正精确的匹配。例如,如果您的记录名称为“dr。dre”,那么“dr dre”(无句号)是否足够接近准确?是“Dre博士”吗?是“dre博士”吗?

    如果您决定实现完全匹配搜索,则可能需要在schema.xml中设置一个copyfield:

    <copyField source="name" dest="exactName"/>
    

    然后,您将要一起搜索两个字段。如何执行此操作取决于您使用的查询解析器。如果您使用的是standard/lucene查询解析器,则需要使用OR搜索来设置查询(例如q=name:"dr. dre" OR exactName:"dr. dre"^4)。搜索字词后的“^ 4”表示该匹配的重要性/相关性是查询中其他位置的匹配的4倍。如果使用的是DismaxExtended Dismax查询解析器,则可以访问较新的 qf 字段,该字段可提供要用于搜索的字段列表,并将某些字段设置为比其他字段更重要。例如,qf=exactName^4 name&q="dr. dre"告诉Solr在两个字段中都检查“dr。dre”,但要考虑精确名称字段中的匹配是名称字段中相关性的4倍。 (如果这对您有用,则可以在qf中设置默认的solrconfig.xml,因此无需在每个查询中都进行重述。)

    这样就没有确定确切名称字段的fieldType。如果您认为只有完全精确的匹配才有效,并且大写字母或标点符号的变化使匹配不精确,则可以将精确名称字段设置为字符串:

    <field name="exactName" type="string" indexed="true" stored="false" multiValued="false"/>
    

    但更可能的是,您将希望允许一些变化,以算作“精确”,在这种情况下,您将需要使用Keyword Tokenizer来创建一个新的fieldType,它不会将确切名称分解为多个索引标记,但要保留它作为单个 token 。例如:

    <fieldType name="exactish" class="solr.TextField">
      <analyzer>
       <tokenizer class="solr.KeywordTokenizerFactory"/>
       <filter class="solr.LowerCaseFilterFactory"/>
      </analyzer>
    </fieldType>
    
    <field name="exactName" type="exactish" indexed="true" stored="false" multiValued="false"/>
    

    这个非常基本的示例仅包括将整个名称保留为单个 token 的关键字 token 生成器,以及确保大小写之间的区别不相关的小写过滤器。如果您希望完全匹配不包含任何其他条件,则需要修改fieldType的分析。

    重要提示:在针对字符串字段或具有关键字标记符的文本字段进行搜索时,是一个好主意,请确保发送给Solr的搜索中始终带有引号(即词组搜索)。否则,您的搜索在与该字段进行比较之前将被分解成单个词,并且您的任何一个词都不可能与整个索引字段匹配。这可能导致根本无法在该字段中找到任何匹配项,除非这些值无论如何都不包含空格。如果您只是使用“规范”来控制具有更多标准标记化功能的te​​xtField中的相关性,那么这不是问题。

    10-07 13:15