Solr组合完全匹配并且可能匹配单个文本字段不起作用

时间:2017-07-11 08:58:51

标签: solr

我正在尝试搜索全名字段和完全匹配office-no,mobile-number,house-no,other-phone-number字段。所有这些我已经复制到文本字段“全搜索-all“这样我就可以在网站上配置单个文本框,用户可以在其中搜索像Kat这样的全名,如果他们在同一文本字段中提供123456789的确切手机号码,则应返回完全匹配结果。当我执行搜索时,其中一个(完全匹配移动设备,办公室,门牌号码或可能与全名匹配)为我的“全搜索全部”字段工作。他们两个都没有在solrAdmin中的全搜索全部字段上工作。我是Stanadard Query Parser。

我已经放置了我为搜索创建的schema.xml文件。

请指出Schema.xml文件中的错误位置。两个搜索都无法在单个文本字段中搜索?

完成下面的schema.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<schema name="dynamic" version="1.5">
    <types>
        <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100" multiValued="true">
            <analyzer type="index">
                <tokenizer class="solr.StandardTokenizerFactory" />
                <filter class="solr.LowerCaseFilterFactory" />
                <filter class="solr.NGramFilterFactory" minGramSize="3" maxGramSize="15" />
            </analyzer>
            <analyzer type="query">
                <tokenizer class="solr.StandardTokenizerFactory" />
                <filter class="solr.LowerCaseFilterFactory" />
            </analyzer>
        </fieldType>
        <fieldType name="search" class="solr.TextField" positionIncrementGap="100" multiValued="true">
            <analyzer type="index">
                <filter class="solr.LowerCaseFilterFactory" />
            </analyzer>
            <analyzer type="query">
                <tokenizer class="solr.StandardTokenizerFactory" />
                <filter class="solr.LowerCaseFilterFactory" />
            </analyzer>
        </fieldType>
        <fieldType name="exactstring" class="solr.TextField" sortMissingLast="true" omitNorms="true">
            <analyzer>
                <tokenizer class="solr.KeywordTokenizerFactory" />
                <filter class="solr.LowerCaseFilterFactory" />
            </analyzer>
        </fieldType>
        <fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true" />
        <fieldType name="long" class="solr.TrieLongField" />
    </types>
    <fields>
        <!-- The _version_ field is required when using the Solr update log or SolrCloud (cfr. SOLR-3432) -->
        <field name="_version_" type="long" indexed="true" stored="true" />
        <field name="full-search-all" type="search" indexed="true" stored="false" multiValued="true" />
        <field name="phone-number" type="exactstring" indexed="true" stored="false" multiValued="true" />
        <!-- Exact Match columns -->
        <copyField source="mobile-number" dest="phone-number" />
        <copyField source="house-no" dest="phone-number" />
        <copyField source="office-no" dest="phone-number" />
        <copyField source="other-phone-number" dest="phone-number" />
        <copyField source="mobile-number" dest="full-search-all" />
        <copyField source="house-no" dest="full-search-all" />
        <copyField source="office-no" dest="full-search-all" />
        <copyField source="other-phone-number" dest="full-search-all" />
        <copyField source="full-name" dest="full-search-all" />
        <!-- query fields -->
        <field name="application-id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
        <field name="full-name" type="text_general" indexed="true" stored="true" required="false" multiValued="false" />
        <field name="mobile-number" type="exactstring" indexed="true" stored="true" required="false" multiValued="false" />
        <field name="house-no" type="exactstring" indexed="true" stored="true" required="false" multiValued="false" />
        <field name="office-no" type="exactstring" indexed="true" stored="true" required="false" multiValued="false" />
        <field name="other-phone-number" type="exactstring" indexed="true" stored="true" required="false" multiValued="false" />
        <field name="campaign-name" type="string" indexed="true" stored="true" required="false" multiValued="false" />
        <field name="reason" type="text_general" indexed="true" stored="true" required="false" multiValued="false" />
    </fields>
    <uniqueKey>application-id</uniqueKey>
</schema>

1 个答案:

答案 0 :(得分:0)

字段名称只能包含字母数字或下划线字符,不能以数字开头

  

该字段的名称。字段名称应仅包含字母数字或下划线字符,不能以数字开头。目前尚未严格执行此操作,但其他字段名称将不具备所有组件的一流支持,并且无法保证后向兼容性。包含前导和尾部下划线的名称(例如版本)是保留的。每个字段都必须有一个名称。

您的大部分字段名称都包含-个字符,请删除该字符。

来源:https://cwiki.apache.org/confluence/display/solr/Defining+Fields

将字段复制到full_search_all字段后,您无法将其与该字段分开。因此,如果您希望将姓名作为前缀,请将手机设为精确搜索,而不是单个字段。

而是编写一个查询分析器,它将告诉您执行搜索的字段。

例如:如果用户在文本框中编写123456789(仅限数字),则查询分析器应返回搜索字段为phone_number

查询将是:

phone_number : 123456789

如果用户在文本框中写ashraful(非数字),您的查询分析器应返回full_name

查询将是:

full_name : ashraful