我试图通过使用SmartChineseAnalyzer在我的索引中添加对中文的支持,但是尽管在分析页面中按预期工作,尝试查询并不返回相同文本的项。
在分析页面中,我使用以下中文文本Field Value (Index)和滴灌作为Field Value (Query)。
搜索术语的标记化和标记似乎与预期的一样工作(以粗体标记的查询值):
netafim \,和|微|灌溉|解决||案|的|全球|领导者,和|微|灌溉|解决||案|的|全球|领导者,和|微|灌溉|解决||案|的|全球|领导者,和|微|灌溉|解决||案|的|全球|领导者,和|微|灌溉|解决||案|的|全球|领导者,在|水,和|微|灌溉|解决||案|的|全球|领导者,在|水,在|水,和|微|灌溉|解决||案|的|全球|领导者,在|水,和|微|灌溉|解决||案|的|全球|领导者,在|水,和|微|灌溉|解决||案|的|全球|领导者,和|微|灌溉|解决||案|的|全球|领导者,和|微|灌溉|解决||案|的|全球|领导者,和|微|灌溉|解决||案|的|全球|领导者,和|微|灌溉|解决||案|的|全球|领导者,在|水,在|水,和|微|灌溉|解决||案|的|全球|领导者,在|水,和|微|灌溉|解决||案|的|全球|领导者,在|水,在|水,和|微|灌溉|解决||案|的|全球|领导者,和|微|灌溉|解决||案|的|全球|领导者,和|微|灌溉|解决||案|的|全球|领导者,和|微|灌溉|解决||案|的|全球|领导者,在|水,和|微|灌溉|解决||案|的|全球|领导者,在|水,netafim,和|微|灌溉|解决||案|的|全球|领导者,和|微|灌溉|解决||案|的|全球|领导者,和|微|灌溉|解决||案|的|全球|领导者,和|微|灌溉|解决||案|的|全球|领导者,在|水,在|水
但是,仅在查询页中查询滴灌并不返回任何结果。
需要注意的是,该文本确实出现在项的属性(description_zh)中,并且我能够通过并行英语属性(description_en)查询来找到项目。
我的配置:
Solr版本- 6.4.2
schema.xml
...
<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"/>
...solrconfig.xml
...
<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>
...我遗漏了什么?
谢谢!西蒙。
发布于 2017-03-14 13:08:19
(1)让我们仔细看看你的solrconfig.xml
<str name="qf">
name^100000
description^25000
text
</str>这意味着您将name、description和text作为查询字段放在dismax查询解析器中(具有不同的字段提升,但这并不重要)。
(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_generalfield=description_zh反对fieldType=text_general_zhhttps://stackoverflow.com/questions/42767854
复制相似问题