首页 > 解决方案 > Solr - 使用 _text_ 包罗万象的字段

问题描述

我正在尝试在我的 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_catch-all 字段,因为我想在不指定运行查询字符串的键的情况下进行自由文本查询。

这就是我的架构的外观

<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 执行查询,如下所示:

Solr 查询界面

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

编辑2:

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

Solr 分析选项卡

标签: solr

解决方案


检查solrconfig.xmlSolr 附带的文件,您会看到/select requestHandler.

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

使用标记requestHandler您要使用哪个作为默认值default="true"


推荐阅读