【问题标题】:SOLR: Search not working with copy field and the custom field typeSOLR:搜索不适用于复制字段和自定义字段类型
【发布时间】:2020-02-21 09:03:54
【问题描述】:

在 solrconfig.xml 文件中

复制字段

<copyField source="Name" dest="NameKeywords"/>
<copyField source="Keywords" dest="NameKeywords"/>

新字段

  <field name="NameKeywords" type="NameKeywordFieldType" indexed="true" stored="true" multiValued="true"/>

自定义字段类型

<fieldType name="NameKeywordFieldType" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
      <tokenizer class="solr.KeywordTokenizerFactory"/>
      <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <filter class="solr.EnglishPossessiveFilterFactory"/>
       <filter class="solr.HyphenatedWordsFilterFactory"/>
    </analyzer>
    <analyzer type="query">
      <tokenizer class="solr.KeywordTokenizerFactory"/>
      <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
      <filter class="solr.SynonymGraphFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt"/>
      <filter class="solr.LowerCaseFilterFactory"/>
      <filter class="solr.EnglishPossessiveFilterFactory"/>
       <filter class="solr.HyphenatedWordsFilterFactory"/>
    </analyzer>
  </fieldType>

所以,当我使用 NameKeywords 字段搜索任何内容时,没有任何效果(返回空数组)

使用 NameKeywords 搜索的结果

{
  "responseHeader":{
    "status":0,
    "QTime":1,
    "params":{
      "q":"NameKeywords:black",
      "_":"1582270957982"}},
  "response":{"numFound":0,"start":0,"docs":[]
  }}

但是当我使用 Name 字段进行搜索时,一切正常。

姓名搜索结果

{
  "responseHeader":{
    "status":0,
    "QTime":0,
    "params":{
      "q":"Name:black",
      "fl":"Name",
      "rows":"2",
      "_":"1582270957982"}},
  "response":{"numFound":32560,"start":0,"docs":[
      {
        "Name":"40037 Black And Stripe Top, Black & Stripe / 10"},
      {
        "Name":"40037 Black And Stripe Top, Black & Stripe / 12"}]
  }}

那么 NameKeywords 字段缺少什么?

【问题讨论】:

  • 我将“KeywordTokenizerFactory”更改为“StandardTokenizerFactory”并且它的工作..
  • 如果你想在空白处分割文本,为什么要使用KeywordTokenizer?在这种情况下使用StandardTokenizerWhitespaceTokenizer
  • 你能告诉我哪个最适合搜索和过滤器吗?
  • 我在这里得到了答案stackoverflow.com/questions/11183017/…
  • 没有什么是“最适合搜索和过滤器”的。您必须定义与您想要的行为相匹配的行为集 - 每个用例都会有所不同。一般来说,使用相同的字段进行过滤/分面/搜索通常不会给任何一个带来好的体验。为不同的用例和行为使用不同的字段。

标签: solr


【解决方案1】:

当您使用KeywordTokenizerFactory 时,不会创建标记,文本将被视为单个标记。当您搜索时,您必须使用该单个标记进行搜索。

<analyzer>
  <tokenizer class="solr.KeywordTokenizerFactory"/>
</analyzer>

在:"Please, email john.doe@foo.com by 03-09, re: m37-xq."

输出: "Please, email john.doe@foo.com by 03-09, re: m37-xq."

如果您想生成令牌,您应该使用 StandardTokenizerWhitespaceTokenizer 作为令牌生成器,而不是 KewordTokenizer。

StandardTokenizer 在标点字符处创建单词/标记,删除标点符号。

<analyzer>
  <tokenizer class="solr.StandardTokenizerFactory"/>
</analyzer>

在: "Please, email john.doe@foo.com by 03-09, re: m37-xq."

输出: "Please", "email", "john.doe", "foo.com", "by", "03", "09", "re", "m37", "xq"

WhitespaceTokenizer 是一个分词器,可以在空格处分割文本。

<analyzer>
  <tokenizer class="solr.WhitespaceTokenizerFactory" rule="java" />
</analyzer>

在: "To be, or what?"

输出: "To", "be,", "or", "what?"

【讨论】:

    【解决方案2】:

    改变:

    KeywordMarkerFilterFactory 到 StandardTokenizerFactory

    <fieldType name="NameKeywordFieldType" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
          <tokenizer class="solr.StandardTokenizerFactory"/>
          <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
          <filter class="solr.LowerCaseFilterFactory"/>
          <filter class="solr.EnglishPossessiveFilterFactory"/>
           <filter class="solr.HyphenatedWordsFilterFactory"/>
        </analyzer>
        <analyzer type="query">
          <tokenizer class="solr.StandardTokenizerFactory"/>
          <filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
          <filter class="solr.SynonymGraphFilterFactory" expand="true" ignoreCase="true" synonyms="synonyms.txt"/>
          <filter class="solr.LowerCaseFilterFactory"/>
          <filter class="solr.EnglishPossessiveFilterFactory"/>
           <filter class="solr.HyphenatedWordsFilterFactory"/>
        </analyzer>
      </fieldType>
    

    【讨论】:

      猜你喜欢
      • 2011-10-23
      • 1970-01-01
      • 2015-02-26
      • 2022-10-13
      • 2021-09-01
      • 2012-02-27
      • 2016-06-25
      • 2013-05-15
      • 1970-01-01
      相关资源
      最近更新 更多