Solr - 使用 _text_ catch-all 字段

Solr - using _text_ catch-all field

我正在尝试在我的 Solr 核心中索引示例 JSON 文档,如下所示

[
  {
    "ID": "1",
    "title": "Cooking Recommendations",
    "tags": ["cooking", "meetup"],
    "posts": [{
        "ID": "2",
        "title": "Cookies",
        "comments": [{
            "ID": "3",
            "content": "Lovely recipe"
          },
          {
            "ID": "4",
            "content": "A-"
          }
        ]
      },
      {
        "ID": "5",
        "title": "Cakes"
      }
    ]
  },
  {
    "ID": "6",
    "title": "For Hire",
    "tags": ["professional", "jobs"],
    "posts": [{
        "ID": "7",
        "title": "Search Engineer",
        "comments": [{
           "ID": "8",
           "content": "I am interested"
         },
         {
           "ID": "9",
           "content": "How large is the team?"
         }
        ]
      },
      {
        "ID": "10",
        "title": "Low level Engineer"
      }
    ]
  }
]

现在,我更新了我的 managed-schema.xml 文件以启用 _text_ 万能字段,因为我想进行自由文本查询而不指定查询字符串应针对的键运行.

这是我的模式的样子

<field name="_root_" type="text_general" indexed="false" stored="true" docValues="false" />
<field name="_nest_path_" type="_nest_path_" />
<fieldType name="_nest_path_" class="solr.NestPathField" />

<field name="_text_" type="text_general" indexed="true" stored="true" multiValued="true"/>
<copyField source="*" dest="_text_"/>

对应的分析器

    <fieldType name="_text_" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
            <tokenizer class="solr.WhitespaceTokenizerFactory" />
            <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" preserveOriginal="1" />
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
            <filter class="solr.LowerCaseFilterFactory" />              
            <filter class="solr.SnowballPorterFilterFactory" language="German" />
            <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.WhitespaceTokenizerFactory"/>
            <filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1" preserveOriginal="1" />
            <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
            <filter class="solr.LowerCaseFilterFactory" />              
            <filter class="solr.SnowballPorterFilterFactory" language="German" />
            <filter class="solr.RemoveDuplicatesTokenFilterFactory"/>
        </analyzer>
    </fieldType>

使用此配置,JSON 文档得到了很好的索引,我能够 运行 像 title:"Cooking Recommendations" 这样的查询来单独检索第一个 JSON 对象。但是,我正在尝试 运行 一个自由文本查询而不指定键 title 并且只传递查询字符串以获取相同的结果。我查看了 Solr 文档,发现我可以使用 CopyField 指令实现此目的,但是,如果我只传递字符串“Cooking Recommendations”,我不会得到任何结果。

我确实看到了核心的架构并看到 _text_ 字段可用。不知道我在这里错过了什么。有人可以指导我吗?

编辑:

我正在使用 Solr 查询 UI 执行我的查询,如下所示:

我使用 /select 作为请求处理程序,将 df 作为 _text_ 传递。尽管如此,它并没有 return 我期望的结果。

编辑 2:

我尝试按照下面的建议使用“分析”选项卡,发现它在那里工作正常。

查看Solr自带的solrconfig.xml文件,你会看到/select requestHandler.

它配置了默认搜索字段,如下所示 <str name="df">name</str>
<lst name="defaults"> </lst> 标签。

使用 default="true" 标记 requestHandler 作为默认设置。

我终于成功完成了这项工作。我所要做的就是删除 _text_ 的分析器并让 Solr 处理它。