我正在尝试搜索全名字段和完全匹配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>
答案 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