Solr匹配整个领域

时间:2014-10-16 22:47:25

标签: search solr

我想创建一个只有在该字段的文档值与没有添加的查询字词匹配时才匹配的字段。例如,查询" john"只应返回名称为" john"而不是" johnson"," johns"等的结果。

我在solr中看到过有关精确匹配的其他帖子,而流行的答案似乎是在schema.xml中使用string类型创建一个新字段。我已经尝试过了,但是当一个字段中包含确切的查询时,该方法似乎也匹配(结果包含" johnson"仍然出现在查询" john")。

架构有字段lastName和lastName_ngram(我们当前正在搜索):

<field name="lastName_ngram"        type="text_token_ngram"     indexed="true" stored="false" omitNorms="true" omitTermFreqAndPositions="true"/>
<fieldType name="text_token_ngram" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
            <tokenizer  class="solr.StandardTokenizerFactory"/>
            <filter     class="solr.LowerCaseFilterFactory"/>
            <filter     class="solr.TrimFilterFactory"/>
            <filter class="solr.EdgeNGramFilterFactory" maxGramSize="20" minGramSize="1"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer  class="solr.StandardTokenizerFactory"/>
            <filter     class="solr.LowerCaseFilterFactory"/>
            <filter     class="solr.TrimFilterFactory"/>
        </analyzer>
    </fieldType>

<field name="lastName"              type="text_token"           indexed="true" stored="true"  omitNorms="true" omitTermFreqAndPositions="true"/>
<fieldType name="text_token" class="solr.TextField" positionIncrementGap="100">
        <analyzer type="index">
            <tokenizer  class="solr.KeywordTokenizerFactory"/>
            <filter     class="solr.LowerCaseFilterFactory"/>
            <filter     class="solr.TrimFilterFactory"/>
        </analyzer>
        <analyzer type="query">
            <tokenizer  class="solr.KeywordTokenizerFactory"/>
            <filter     class="solr.LowerCaseFilterFactory"/>
            <filter     class="solr.TrimFilterFactory"/>
        </analyzer>
    </fieldType>

我想要包含一个字段lastNameExact,以便可以提升与整个字段完全匹配的文档:

<field name="lastNameExact"         type="string"               indexed="true" stored="false" omitNorms="true" omitTermFreqAndPositions="true"/>
<copyField source="lastName"      dest="lastNameExact"/>

我可以对此进行修改,以便lastNameExact字段只会覆盖包含具有整个搜索查询的字段的文档吗?

1 个答案:

答案 0 :(得分:1)

我可以建议你解决这个问题。不要对lastNameExact使用字符串类型,而是使用 exact_match 字段类型。

<fieldType name="exact_match" class="solr.TextField" positionIncrementGap="100">
            <analyzer>
                <tokenizer class="solr.KeywordTokenizerFactory"/>
                <filter class="solr.LowerCaseFilterFactory"/>
                <filter class="solr.TrimFilterFactory"/>
            </analyzer>
 </fieldType>

复制字段应保持不变。

工作schema.xml的链接 - https://github.com/MysterionRise/information-retrieval-adventure/blob/dadb683820fe4f1eaf6081185a933a28a5e1e481/lucene5/src/main/resources/solr/cores/test/conf/schema.xml