我正在尝试使用SmartChineseAnalyzer
在索引中添加对中文的支持,但尽管在“分析”页面中按预期工作,但尝试查询时不会返回具有相同文本的项目。
在分析页面中,我使用以下中文文本Field Value (Index)
和滴灌作为Field Value (Query)
。
搜索词的标记化和标记似乎按预期工作(查询值以粗体标记):
netafim |是的用于|实现|可|持续|未来|的| 滴灌 |和|微|灌溉|解决| |案|的|全球|领导者| |在|水| |粮食|安全|和|耕地|的| 交汇|处| | 滴灌 |可|使|种植|者|以|最低|的|环境|影响|实现 |粮食|生产|的|最大化
但是,只需在查询页面中查询滴灌就不会返回任何结果。
重要的是要注意,此文本确实出现在项目的属性(description_zh
)中,并且我能够通过并行英语属性(description_en
)查询来找到该项目。
我的配置:
Solr版本 - 6.4.2
...
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_en.txt" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_en.txt" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType>
<fieldType name="text_general_zh" class="solr.TextField">
<analyzer class="org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer"/>
</fieldType>
...
<field name="id" type="string" indexed="true" stored="true" required="true" />
<field name="description_en" type="text_general" indexed="true" stored="true" multiValued="false"/>
<field name="description_zh" type="text_general_zh" indexed="true" stored="true" multiValued="false"/>
<field name="size" type="string" indexed="true" stored="true" multiValued="false"/>
<field name="name_en" type="text_en_splitting" indexed="true" stored="true" multiValued="false"/>
<field name="name_zh" type="text_en_splitting" indexed="true" stored="true" multiValued="false"/>
...
<uniqueKey>id</uniqueKey>
<!-- Copy Fields -->
<copyField source="name_en" dest="text"/>
<copyField source="name_zh" dest="text"/>
<copyField source="description_en" dest="text"/>
<copyField source="description_zh" dest="text"/>
...
...
<luceneMatchVersion>6.4.2</luceneMatchVersion>
<lib dir="${solr.install.dir:../../../..}/contrib/analysis-extras/lib" />
<lib dir="${solr.install.dir:../../../..}/contrib/analysis-extras/lucene-libs" />
<lib dir="../lib/" regex="mysql-connector-java-\d.*\.jar" />
<lib dir="../lib/" regex="lucene-analyzers-smartcn-\d.*\.jar" />
<lib dir="${solr.install.dir:../../../..}/dist/" regex="solr-dataimporthandler-.*\.jar" />
<directoryFactory name="DirectoryFactory"
class="${solr.directoryFactory:solr.NRTCachingDirectoryFactory}">
</directoryFactory>
<codecFactory class="solr.SchemaCodecFactory"/>
<schemaFactory class="ClassicIndexSchemaFactory"/>
<dataDir>${solr.blacklight-core.data.dir:}</dataDir>
<requestDispatcher handleSelect="true" >
<requestParsers enableRemoteStreaming="false" multipartUploadLimitInKB="2048" />
</requestDispatcher>
<requestHandler name="/analysis/field" startup="lazy" class="solr.FieldAnalysisRequestHandler" />
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">data-config.xml</str>
</lst>
</requestHandler>
<!-- config for the admin interface -->
<admin>
<defaultQuery>*:*</defaultQuery>
</admin>
<requestHandler name="search" class="solr.SearchHandler" default="true">
<!-- default values for query parameters can be specified, these
will be overridden by parameters in the request
-->
<lst name="defaults">
<str name="defType">dismax</str>
<str name="echoParams">explicit</str>
<int name="rows">10</int>
<str name="q.alt">*:*</str>
<str name="q.op">OR</str>
<str name="df">text</str>
<str name="mm">2<-1 5<-2 6<90%</str>
<str name="qf">
name^100000
description^25000
text
</str>
<str name="pf">
name^1000000
description^250000
text^10
</str>
<str name="fl">
id,
name_en,
name_zh,
size,
description_en,
description_zh,
created_at,
updated_at
</str>
<str name="facet">true</str>
<str name="facet.mincount">1</str>
<str name="facet.limit">10</str>
<str name="facet.field">company_size</str>
</lst>
...
我错过了什么?
谢谢! 西蒙。
答案 0 :(得分:2)
(1)让我们仔细看看 solrconfig.xml :
<str name="qf">
name^100000
description^25000
text
</str>
这意味着您在name
查询解析器中具有description
,text
和dismax
作为查询字段(具有不同的字段提升,但是&#39;不那么重要。)
(2)text
字段累积来自多个来源的字段值:name_en
,name_zh
,description_en
,description_zh
。这就是 schema.xml 正在执行的操作:
<!-- Copy Fields -->
<copyField source="name_en" dest="text"/>
<copyField source="name_zh" dest="text"/>
<copyField source="description_en" dest="text"/>
<copyField source="description_zh" dest="text"/>
(3)另一方面,text
字段没有对中文进行分析(我打赌它有fieldType=text_general
- 如果我错了,请纠正我) 。因此,通过查询text
字段,您将永远无法获得与中文相关的文本分析。
(4)为了解决您的问题,您应该分离查询时间字段集。即而不是text
字段(它是所有字段的累加器)使它分开,如下所示:
<str name="qf">
name^100000
description^25000
name_en
name_zh
description_en
description_zh
</str>
然后分析器将针对正确的fieldType
:
field=description_en
针对fieldType=text_general
field=description_zh
针对fieldType=text_general_zh