我索引了一个小集合(大约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>
一些有价值的评论:
我的问题:
当用户选择(使用下拉框)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”参数以及“精确”匹配上的提升来搜索“过滤字段”。
我想再添加一个过滤器:“apo_ses”。该字段将保持如下值:“ΜΕΡΑ”,“ΜΕΣΗΜΕΡΙ”,“ΑΠΟΓΕΥΜΑ”和“ΒΡΑΔΥ”。是否有可能在使用值进行过滤时给出solr指令,假设“ΜΕΡΑ”返回由“ΜΕΡΑ”和“ΜΕΣΗΜΕΡΙ”或“ΜΕΡΑ”或“ΜΕΣΗΜΕΡΙ”过滤的文档?
非常感谢任何帮助。
我希望不要厌恶我的写作。
答案 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“ΜΕΣΗΜΕΡΙ”)或“ΜΕΡΑ”或“ΜΕΣΗΜΕΡΙ”)