Solr [版本3.6.1]过滤查询问题

时间:2014-01-07 15:32:15

标签: lucene solr-boost

我索引了一个小集合(大约150k文档)。我让用户能够使用下拉框进行过滤查询。 “字段查询”字段是:apo_taxonomy,apo_dik,apo_number和apo_date。以下是schema.xml的一部分:

<fieldType name="text_efe_dioi_s" class="solr.TextField" positionIncrementGap="100" >
        <analyzer type="index">
            <tokenizer class="solr.WhitespaceTokenizerFactory"/>
            <filter class="solr.LimitTokenCountFilterFactory" maxTokenCount="20"/>
            <filter class="solr.GreekLowerCaseFilterFactory"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer class="solr.WhitespaceTokenizerFactory"/>
            <filter class="solr.LimitTokenCountFilterFactory" maxTokenCount="20"/>
            <filter class="solr.GreekLowerCaseFilterFactory"/>
        </analyzer>
    </fieldType>


    <fieldType name="text_efe_dioi" class="solr.TextField" positionIncrementGap="100">    
      <analyzer type="index">       
        <tokenizer class="solr.StandardTokenizerFactory"/>      
        <filter class="solr.GreekLowerCaseFilterFactory"/>
        <filter class="solr.GreekStemFilterFactory"/>
      </analyzer>     
      <analyzer type="query">
        <tokenizer class="solr.StandardTokenizerFactory"/>      
        <filter class="solr.GreekLowerCaseFilterFactory"/>
        <filter class="solr.GreekStemFilterFactory"/>       
      </analyzer>
    </fieldType>


<fields>
<field  name="ida" type="string" indexed="true" stored="true" multiValued="false"/>
  <field  name="solr_id" type="string" indexed="true" stored="true" multiValued="false"/> 
  <field  name="apo_number" type=" text_efe_dioi " indexed="true" stored="true" multiValued="true"/>
  <field  name="apofasi_date" type=" text_efe_dioi " indexed="true" stored="true"/>
  <field  name="apo_dik" type=" text_efe_dioi " indexed="true" stored="true"/>
  <field  name="apo_taxonomy" type=" text_efe_dioi " indexed="true" stored="true"/>
  <field  name="content" type=" text_efe_dioi " indexed="true" stored="true" multiValued="true"/> 
  <field  name="type" type="string" indexed="true" stored="true"/>  
  <field  name="model" type="string" indexed="true" stored="true" multiValued="false"/>  
  <field  name="url" type="string" indexed="true" stored="true"/>
  <field  name="search_tag" type=" text_efe_dioi " indexed="true" stored="true"/>
  <field  name="contentbin" type="text" indexed="true" stored="true" multiValued="true"/>
  <field  name="last_modified" type="string" indexed="true" stored="true"/>  
  <field  name="title" type=" text_efe_dioi " indexed="true" stored="true" multiValued="true"/>
  <field  name="grid_title" type=" text_efe_dioi " indexed="true" stored="true"/>
  <field  name="contentS" type=" text_efe_dioi _s" indexed="true" stored="true"/>
 </fields>

<copyField source="apo_number" dest="content" />       
   <copyField source="apo_date" dest="content" />   
   <copyField source="apo_dik" dest="content" />   
   <copyField source="apo_taxonomy" dest="content" />   
   <copyField source="title" dest="content" />    
   <copyField source="search_tag" dest="content" />
   <copyField source="contentbin" dest="content"/>     
   <copyField source="content" dest="contentS" />

我还提供了有关“SearchHandler”的solrconfig.xml的一部分。我这样做是为了推动“严格”(锚定)短语匹配:

<requestHandler name="/select" class="solr.SearchHandler">
     <lst name="defaults">
       <!--<str name="defType">edismax</str>
       <str name="qf">content contentS^10</str>
       <str name="pf">content^10 contentS^100</str>
       <str name="ps">100</str>-->
       <str name="echoParams">explicit</str>
       <int name="rows">150</int>
       <str name="sort">score desc</str>
       <str name="defType">edismax</str>
       <str name="qf">content contentS^10</str>
       <str name="pf">content^10 contentS^100</str>
       <str name="ps">100</str>
       <str name="wt">json</str>
       <str name="hl">true</str>       
       <str name="fl">solr_id,ida,type,model,keywordlist,title,apo_taxonomy,apo_dik,apo_date,grid_title</str>
       <str name="hl.fl">content,title</str>
       <str name="f.content.hl.alternateField">content</str>
       <str name="hl.maxAlternateFieldLength">800</str>
       <str name="hl.fragsize">800</str>       
     </lst>  
    </requestHandler>

一些有价值的评论:

  1. “apo_taxonomy”字段可以包含如下值:“Πόρτα”,“Πόρτα-1”和“Πόρτα-ασφ1”
  2. “apo_dik”字段可以包含以下值:“Μια”,“Μιάμιση”和“ΟΧΤΟ”
  3. “apo_date”和“apo_number”字段可以包含数值。
  4. 以上所有字段均使用“”。我使用“solr.TextField”类的原因是将上述字段复制到一个字段(“content”)中,并通过solr的基本查询(“q”参数)进行搜索。
  5. 整个系列都是希腊语。
  6. 我的问题:

    1. 当用户选择(使用下拉框)apo_taxonomy值“Πόρτα”时,Solr返回包含“Πόρτα-1”和“Πόρτα-ασφ1”(http://example.com/solr/efe_dioi/select/?q= 的文档&amp; fq = apo_taxonomy :(Πόρτα)+ apo_date:(2009)&amp; start = 0&amp; rows = 100)。这不是用户需要的。当用户过滤“Πόρτα”(apo_taxonomy)的文档的集合时,他/她不会看到“Πόρτα-1”和/或“Πόρτα-ασφ1”的文档。使用“solr.TextField”可行吗?正如您所注意到的,我需要使用“q”参数以及“精确”匹配上的提升来搜索“过滤字段”。

    2. 我想再添加一个过滤器:“apo_ses”。该字段将保持如下值:“ΜΕΡΑ”,“ΜΕΣΗΜΕΡΙ”,“ΑΠΟΓΕΥΜΑ”和“ΒΡΑΔΥ”。是否有可能在使用值进行过滤时给出solr指令,假设“ΜΕΡΑ”返回由“ΜΕΡΑ”和“ΜΕΣΗΜΕΡΙ”或“ΜΕΡΑ”或“ΜΕΣΗΜΕΡΙ”过滤的文档?

    3. 非常感谢任何帮助。

      我希望不要厌恶我的写作。

1 个答案:

答案 0 :(得分:0)

对于你的问题1,我建议使用type作为字符串。如果你的字段(例如:apo_taxonomy)也将用于搜索,那么考虑使用带有字符串类型的apo_taxonomy_exact用于fq,其中apo_taxonomy_exact是apo_taxonomy的副本,用于fq目的的非标记化形式。 <copyField source="apo_number" dest="apo_taxonomy_exact" /> apo_taxonomy_exact的类型为:

对于你的第二个问题,是做类似fq = apo_ses :((“ΜΕΡΑ”AND“ΜΕΣΗΜΕΡΙ”)或“ΜΕΡΑ”或“ΜΕΣΗΜΕΡΙ”)