Solr - 分析工作但查询结果为零

时间:2017-03-13 15:47:08

标签: solr

我正在尝试使用SmartChineseAnalyzer在索引中添加对中文的支持,但尽管在“分析”页面中按预期工作,但尝试查询时不会返回具有相同文本的项目。

在分析页面中,我使用以下中文文本Field Value (Index)滴灌作为Field Value (Query)

搜索词的标记化和标记似乎按预期工作(查询值以粗体标记):

  

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&lt;-1 5&lt;-2 6&lt;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>

    ...

我错过了什么?

谢谢! 西蒙。

1 个答案:

答案 0 :(得分:2)

(1)让我们仔细看看 solrconfig.xml

   <str name="qf">
     name^100000
     description^25000
     text
   </str>

这意味着您在name查询解析器中具有descriptiontextdismax作为查询字段(具有不同的字段提升,但是&#39;不那么重要。)

(2)text字段累积来自多个来源的字段值:name_enname_zhdescription_endescription_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