Solr Suggestion(Spellcheck)多项查询的动态字段选择

san*_*den 6 lucene solr solr-schema

我正在使用具有以下配置的solr建议组件:

schema.xml中

<fieldType name="textSpell" class="solr.TextField">
 <analyzer>
   <tokenizer class="solr.StandardTokenizerFactory"/>
   <filter class="solr.LowerCaseFilterFactory"/>
 </analyzer>
</fieldType>
<field name="image_memo" type="text_general"/>
<field name="username" type="text_general"/>
<field name="image_memo" type="text_general"/>
<field name="image_text" type="text_general"/>
<!-- More fields included here -->
<field name="spell" type="textSpell" indexed="true" stored="true" multiValued="true"/>
<copyField source="*" dest="spell"/>
Run Code Online (Sandbox Code Playgroud)

solrconfig.xml中

<searchComponent class="solr.SpellCheckComponent" name="suggest">
    <lst name="spellchecker">
        <str name="name">suggest</str>
        <str name="classname">org.apache.solr.spelling.suggest.Suggester</str>
        <str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str>
        <str name="field">spell</str>
        <str name="buildOnCommit">true</str>
    </lst>
</searchComponent>

<requestHandler class="org.apache.solr.handler.component.SearchHandler"
    name="/suggest">
    <lst name="defaults">
        <str name="spellcheck">true</str>
        <str name="spellcheck.dictionary">suggest</str>
        <str name="spellcheck.onlyMorePopular">true</str>
        <str name="spellcheck.count">6</str>
        <str name="spellcheck.collate">true</str>
        <str name="spellcheck.collateExtendedResults">true</str>
        <str name="spellcheck.collate">true</str>
        <str name="spellcheck.maxCollations">6</str>
        <str name="spellcheck.maxCollationTries">1000</str>
        <str name="spellcheck.extendedResults">true</str>
        <str name="spellcheck.collateParam.mm">100%</str>
    </lst>
    <arr name="components">
        <str>suggest</str>
        <str>query</str>
    </arr>
</requestHandler>
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,spell我正在使用一个字段来进行建议查询.即使对于多个术语查询,这也很有用.

但我需要的是只搜索选定的字段.
因此,例如,我想有效的建议只对域image_memousername 用户可以动态地添加和删除字段进行搜索.

我知道我可以这样做:

q =(image_memo:*search*OR image_username:*search*)

但是,如果你有很多字段和多项查询,那么这种情况会急剧减缓.

示例:在字段memo, username, field, field1 and field2中搜索term, term1 and term2.

((备注:长期或用户名:长期或现场:长期或字段1:长期或场:)AND(备注:字词1或用户名:字词1或现场:字词1 或字段1:字词1或场:字词1)AND(备注:词条2 OR username:term2 OR field:term2 OR field1:term2 OR field2:term2))

有没有办法动态选择spell字段.或者有没有办法只在多值字段中搜索特定字段

我正在使用Apach Solr 4 Alpha.

Sam*_*cía 0

您需要做的就是使用DismaxeDismax。SpellcheckComponent 使用您的查询参数自动运行每个建议。

所以,你必须这样查询:

/suggest?q={!dismax}term1 term2 term3&qf=memo username field field1 field2
Run Code Online (Sandbox Code Playgroud)

或者

/suggest?q=term1 term2 term3&defType=dismax&qf=memo username field field1 field2
Run Code Online (Sandbox Code Playgroud)

如果您不想使用 (e)dismax,您可以实现自定义查询解析器。