【问题标题】:Solr combining exact match and likely match on single text field not workingSolr 在单个文本字段上结合完全匹配和可能匹配不起作用
【发布时间】:2017-07-11 08:58:51
【问题描述】:

我正在尝试对全名字段执行可能的搜索,并在 office-no、mobile-number、house-no、other-phone-number 字段上进行完全匹配。所有这些我已复制到文本字段“full-search -all”,以便我可以在网站中配置单个文本框,用户可以在其中搜索全名,如 Kat 应该返回 Katric,如果他们在同一文本字段中提供确切的手机号码为 123456789,则应该返回完全匹配的结果。当我执行搜索时,其中一个(在移动设备、办公室、门牌号码上完全匹配或可能在全名上匹配)在我的“全搜索”字段中工作。他们都没有在 solrAdmin 中的全搜索字段上工作.我是标准查询解析器。

我已经放置了我为搜索创建的 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>

【问题讨论】:

    标签: solr


    【解决方案1】:

    字段名只能由字母数字或下划线字符组成,不能以数字开头

    字段的名称。字段名称应仅由字母数字或下划线字符组成,并且不能以数字开头。这目前没有严格执行,但其他字段名称不会得到所有组件的一流支持,并且不能保证向后兼容性。带有前导和尾随下划线的名称(例如 version)是保留的。每个字段都必须有一个名称。

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

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

    一旦您将字段复制到full_search_all 字段中,您就无法将它们与该字段分开。因此,如果您希望名称作为前缀,电话作为精确搜索,您不能使用单个字段来执行此操作。

    改为编写一个查询分析器,它会告诉你在哪个字段上执行搜索。

    例如:如果用户在文本框中输入123456789(仅数字),您的查询分析器应返回要搜索的字段为phone_number

    查询将是:

    phone_number : 123456789
    

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

    查询将是:

    full_name : ashraful
    

    【讨论】:

    • 确定。将删除 - 字符。它是否有助于我的文本字段执行来自不同字段的可能匹配和完全匹配等搜索?
    • 嗨,我已经创建了可能的搜索并映射到如下全名。但排序不适用于 solr 管理 UI 中的全名字段。在 xml 文件下方。我想对全名和电话号码、office-no、house-no 的完全匹配执行可能的搜索,并对全名进行排序,更多字段。因为我添加了 NGramFilter,所以对全名进行排序有问题工厂。添加带有页面的 xml 文件
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-05
    • 1970-01-01
    • 2019-06-14
    • 1970-01-01
    相关资源
    最近更新 更多