Solr 不高亮某些单词
Solr does not highlight some words
我用 highlighting functionality 配置了 solr 4.10(也是 5.3)。它适用于大多数单词,但是我发现一些单词“不”允许突出显示,即 solr returns 所需的文档,但不会突出显示一些其中
什么会造成这样的影响?
solrconfig.xml
<requestHandler name="/select" class="solr.SearchHandler">
<lst name="defaults">
<str name="wt">json</str>
<str name="indent">true</str>
<str name="defType">edismax</str>
<str name="bf">product(concount)</str>
<str name="df">text bio text_syn text_syn_other</str>
<str name="qf">
text^25 bio^16 text_syn^8 text_syn_other^3
</str>
<str name="hl">on</str>
<str name="hl.fl">text bio text_syn text_syn_other</str>
<str name="hl.preserveMulti">true</str>
<str name="hl.encoder">html</str>
<str name="f.text.hl.fragsize">100</str>
<str name="hl.snippets">20</str>
<arr name="components">
<str>highlight</str>
</arr>
</lst>
schema.xml
<fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.PatternTokenizerFactory" pattern="[\s\n,/\]" />
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<filter class="solr.PorterStemFilterFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms_abbr.txt" ignoreCase="true" expand="false"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.PatternTokenizerFactory" pattern="[\s\n,/\]" />
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<filter class="solr.PorterStemFilterFactory"/>
</analyzer>
</fieldType>
<fieldType name="text_en_syn" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.PatternTokenizerFactory" pattern="[\s\n,/\]" />
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<filter class="solr.PorterStemFilterFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.PatternTokenizerFactory" pattern="[\s\n,/\]" />
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<filter class="solr.PorterStemFilterFactory"/>
</analyzer>
</fieldType>
<fieldType name="text_en_syn_other" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.PatternTokenizerFactory" pattern="[\s\n,/\]" />
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<filter class="solr.PorterStemFilterFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms_other.txt" ignoreCase="true" expand="false"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.PatternTokenizerFactory" pattern="[\s\n,/\]" />
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<filter class="solr.PorterStemFilterFactory"/>
</analyzer>
</fieldType>
<field name="text" type="text_en" indexed="true" stored="true" multiValued="false" />
<field name="text_syn" type="text_en_syn" indexed="true" stored="false" multiValued="true" />
<field name="text_syn_other" type="text_en_syn_other" indexed="true" stored="false" multiValued="true" />
<field name="text_exact" type="string" indexed="true" stored="false" multiValued="false" />
<field name="bio" type="text_en" indexed="true" stored="true" multiValued="false" />
<field name="bio_exact" type="string" indexed="true" stored="false" multiValued="false" />
<field name="concount" type="long" indexed="true" stored="true" multiValued="false" />
<field name="concount_exact" type="long" indexed="true" stored="false" multiValued="false" />
<copyField source="text" dest="text_syn"/>
<copyField source="bio" dest="text_syn"/>
<copyField source="text" dest="text_syn_other"/>
<copyField source="bio" dest="text_syn_other"/>
对于查询 http://localhost:8983/solr/select?q=senior
,我得到了包含单词 senior
的文档,但在 solr 响应的突出显示部分,该单词未突出显示。
更新 1:
我发现我的 synonyms_abbr.txt
文件中有单词 senior
,即 senior,lead
行。当我评论该行或替换单词 lead,senior
的位置时,令人惊讶的是单词 senior
开始突出显示。有什么想法吗?
更新 2:
synonyms.txt
和 synonyms_other.txt
中的单词正常突出显示,但 synonyms_abbr.txt
中的单词表现异常如下。例如,我有行 lead,head,senior
in synonyms_abbr.txt
then
- 查询
http://localhost:8983/solr/select?q=senior
和 http://localhost:8983/solr/select?q=head
没有突出显示任何单词,
- 查询
http://localhost:8983/solr/select?q=lead
不仅突出显示单词 lead
,而且突出显示 head
和 senior
。
部分字段未存储,无法返回。因为它们被编入索引,所以它们是可搜索的。将您的架构更改为已存储="true" 用于您要突出显示的所有字段。
<field name="text_syn" type="text_en_syn" indexed="true" stored="true" multiValued="true" />
<field name="text_syn_other" type="text_en_syn_other" indexed="true" stored="true" multiValued="true" />
通过查看您的配置,我推测突出显示字段 bio 和 text?
能否尝试将 senior,lead 和 lead,senior 添加到文件 synonyms_abbr.txt 然后尝试 运行 荧光笔
从你的 update2 可以清楚地看出,实际上只有 lead,head,senior
中的第一个词用于同义词匹配和突出显示。
如果您查看 SolrWiki 上的文档 https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters,会提到 expand=true
具有一定的效果
同义词参数命名一个定义同义词的外部文件。
如果 ignoreCase 为真,则在检查相等性之前匹配将小写。
如果expand为真,一个同义词将被展开为所有等价的同义词。如果为 false,则所有等同的同义词将减少到列表中的第一个 .
该站点还提供了示例
# If expand==true, "ipod, i-pod, i pod" is equivalent to the explicit mapping:
ipod, i-pod, i pod => ipod, i-pod, i pod
# If expand==false, "ipod, i-pod, i pod" is equivalent to the explicit mapping:
ipod, i-pod, i pod => ipod
这似乎与您观察到的行为一致。
这意味着您应该更改 schema.xml 中的同义词过滤器定义以使用 expand=true 或
更改同义词文件定义过滤器的方式以使用显式映射。
此外,由于分析器在编制索引时工作,您可能需要重新索引文档才能使其工作。
我用 highlighting functionality 配置了 solr 4.10(也是 5.3)。它适用于大多数单词,但是我发现一些单词“不”允许突出显示,即 solr returns 所需的文档,但不会突出显示一些其中
什么会造成这样的影响?
solrconfig.xml
<requestHandler name="/select" class="solr.SearchHandler">
<lst name="defaults">
<str name="wt">json</str>
<str name="indent">true</str>
<str name="defType">edismax</str>
<str name="bf">product(concount)</str>
<str name="df">text bio text_syn text_syn_other</str>
<str name="qf">
text^25 bio^16 text_syn^8 text_syn_other^3
</str>
<str name="hl">on</str>
<str name="hl.fl">text bio text_syn text_syn_other</str>
<str name="hl.preserveMulti">true</str>
<str name="hl.encoder">html</str>
<str name="f.text.hl.fragsize">100</str>
<str name="hl.snippets">20</str>
<arr name="components">
<str>highlight</str>
</arr>
</lst>
schema.xml
<fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.PatternTokenizerFactory" pattern="[\s\n,/\]" />
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<filter class="solr.PorterStemFilterFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms_abbr.txt" ignoreCase="true" expand="false"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.PatternTokenizerFactory" pattern="[\s\n,/\]" />
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<filter class="solr.PorterStemFilterFactory"/>
</analyzer>
</fieldType>
<fieldType name="text_en_syn" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.PatternTokenizerFactory" pattern="[\s\n,/\]" />
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<filter class="solr.PorterStemFilterFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="false"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.PatternTokenizerFactory" pattern="[\s\n,/\]" />
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<filter class="solr.PorterStemFilterFactory"/>
</analyzer>
</fieldType>
<fieldType name="text_en_syn_other" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.PatternTokenizerFactory" pattern="[\s\n,/\]" />
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<filter class="solr.PorterStemFilterFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms_other.txt" ignoreCase="true" expand="false"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.PatternTokenizerFactory" pattern="[\s\n,/\]" />
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.EnglishPossessiveFilterFactory"/>
<filter class="solr.KeywordMarkerFilterFactory" protected="protwords.txt"/>
<filter class="solr.PorterStemFilterFactory"/>
</analyzer>
</fieldType>
<field name="text" type="text_en" indexed="true" stored="true" multiValued="false" />
<field name="text_syn" type="text_en_syn" indexed="true" stored="false" multiValued="true" />
<field name="text_syn_other" type="text_en_syn_other" indexed="true" stored="false" multiValued="true" />
<field name="text_exact" type="string" indexed="true" stored="false" multiValued="false" />
<field name="bio" type="text_en" indexed="true" stored="true" multiValued="false" />
<field name="bio_exact" type="string" indexed="true" stored="false" multiValued="false" />
<field name="concount" type="long" indexed="true" stored="true" multiValued="false" />
<field name="concount_exact" type="long" indexed="true" stored="false" multiValued="false" />
<copyField source="text" dest="text_syn"/>
<copyField source="bio" dest="text_syn"/>
<copyField source="text" dest="text_syn_other"/>
<copyField source="bio" dest="text_syn_other"/>
对于查询 http://localhost:8983/solr/select?q=senior
,我得到了包含单词 senior
的文档,但在 solr 响应的突出显示部分,该单词未突出显示。
更新 1:
我发现我的 synonyms_abbr.txt
文件中有单词 senior
,即 senior,lead
行。当我评论该行或替换单词 lead,senior
的位置时,令人惊讶的是单词 senior
开始突出显示。有什么想法吗?
更新 2:
synonyms.txt
和 synonyms_other.txt
中的单词正常突出显示,但 synonyms_abbr.txt
中的单词表现异常如下。例如,我有行 lead,head,senior
in synonyms_abbr.txt
then
- 查询
http://localhost:8983/solr/select?q=senior
和http://localhost:8983/solr/select?q=head
没有突出显示任何单词, - 查询
http://localhost:8983/solr/select?q=lead
不仅突出显示单词lead
,而且突出显示head
和senior
。
部分字段未存储,无法返回。因为它们被编入索引,所以它们是可搜索的。将您的架构更改为已存储="true" 用于您要突出显示的所有字段。
<field name="text_syn" type="text_en_syn" indexed="true" stored="true" multiValued="true" />
<field name="text_syn_other" type="text_en_syn_other" indexed="true" stored="true" multiValued="true" />
通过查看您的配置,我推测突出显示字段 bio 和 text?
能否尝试将 senior,lead 和 lead,senior 添加到文件 synonyms_abbr.txt 然后尝试 运行 荧光笔
从你的 update2 可以清楚地看出,实际上只有 lead,head,senior
中的第一个词用于同义词匹配和突出显示。
如果您查看 SolrWiki 上的文档 https://wiki.apache.org/solr/AnalyzersTokenizersTokenFilters,会提到 expand=true
具有一定的效果
同义词参数命名一个定义同义词的外部文件。 如果 ignoreCase 为真,则在检查相等性之前匹配将小写。 如果expand为真,一个同义词将被展开为所有等价的同义词。如果为 false,则所有等同的同义词将减少到列表中的第一个 .
该站点还提供了示例
# If expand==true, "ipod, i-pod, i pod" is equivalent to the explicit mapping:
ipod, i-pod, i pod => ipod, i-pod, i pod
# If expand==false, "ipod, i-pod, i pod" is equivalent to the explicit mapping:
ipod, i-pod, i pod => ipod
这似乎与您观察到的行为一致。 这意味着您应该更改 schema.xml 中的同义词过滤器定义以使用 expand=true 或 更改同义词文件定义过滤器的方式以使用显式映射。
此外,由于分析器在编制索引时工作,您可能需要重新索引文档才能使其工作。