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 处理它。
我正在尝试在我的 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 处理它。