【问题标题】:Solr match entire fieldSolr 匹配整个字段
【发布时间】:2014-12-12 10:55:03
【问题描述】:

我想创建一个字段,该字段仅在该字段的文档值与查询词匹配且不添加任何内容时才匹配。例如,对“john”的查询应该只返回名称为“john”的结果,而不是“johnson”、“johns”等。

我看过其他关于 solr 中精确匹配的帖子,普遍的答案似乎是在 schema.xml 中创建一个字符串类型的新字段。我已经尝试过了,但是当确切的查询包含在字段中时,这种方法似乎也匹配(包含“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 字段仅命中包含包含整个搜索查询的字段的文档?

【问题讨论】:

  • 奇怪!字符串字段应该给你精确的区分大小写的匹配,所以如果你搜索lastNameExact:john,它不应该返回姓氏johnson等的文档,

标签: search solr


【解决方案1】:

我可以建议你解决这个问题。请勿将类型 string 用于 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

【讨论】:

  • 链接现在是 404,请考虑直接链接到提交。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多