我已经在堆栈溢出中搜索了此问题,但没有一个解决特定模式的字母-连字符号,这似乎是Solr遇到问题的特定情况。
我们提供的产品带有短连字符的字母数字单词,需要在Solr中进行索引并可以搜索。例如,标题为“ aimpoint t-2”的产品。用户应该能够查询“ t-2”或“ aimpoint t-2”以获得结果。
我尝试了所有可能的令牌生成器和过滤器组合,但无法完成此操作,希望这是我错过的简单操作。
schema.xml(Solr 6.5)的相关部分:
<field name="product_name" type="text_en" indexed="true" stored="true" multiValued="false" />
<fieldType name="text_en" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.ClassicTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.WordDelimiterGraphFilterFactory" preserveOriginal="1"/>
<filter class="solr.FlattenGraphFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.ClassicTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.WordDelimiterGraphFilterFactory" preserveOriginal="1"/>
</analyzer>
</fieldType>
预先感谢
更新1:
每个MatsLindh答案我有以下更新的schema.xml
<fieldType name="text_en" class="solr.TextField">
<analyzer type="index">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
</analyzer>
</fieldType>
这是调试查询数据:
这与调试json的这一部分有关吗?
"parsedquery":"+(+SynonymQuery(Synonym(text:t text:t2)) +text:2)",
"parsedquery_toString":"+(+Synonym(text:t text:t2) +text:2)",
似乎要删除连字符
答案 0 :(得分:1)
Solr在索引编制过程中没有关于-
的任何特殊问题-任何处理将由令牌生成器和过滤器中的规则确定,并且您可以使用Solr管理员中的Analysis
标签界面,以查看整个链中每个步骤的文本处理方式。
您将需要一个WhitespaceTokenizer
仅在上拆分(而不是
-
或StandardTokenizer
将拆分的ClassicTokenizer
。经典令牌生成器应该不理会t-2
,但是您的下一个步骤将不会)。
除非您想进一步分割WordDelimiterGraphFilterFactory
,否则您还将删除t
(即,如果您需要仅搜索t-2
而不是t-2
的话。
根据单词定界符图形过滤器的描述:
非字母数字字符(已舍弃):“热点”->“热点”,“热点”
..如果要将该令牌保留为WITH main_query AS (
SELECT
id_socio,
nome,
nif,
num_mecanografico,
IFNULL(
(SELECT
quota_nova
FROM QUOTAS_TEMPORARIAS temp_quota
WHERE id_socio = temp_quota.id_socio
AND ANO = 2019
AND MES = 10),
quota) quota
FROM SOCIO socio,
TIPO_PAGAMENTO tipo_pag,
AGRUPAMENTO agrup,
ORGANIZACAO org
WHERE socio.ID_TIPO_PAGAMENTO = tipo_pag.ID_TIPO_PAGAMENTO
AND socio.id_agrupamento = agrup.id_agrupamento
AND agrup.id_organizacao = o.id_organizacao
AND org.id_organizacao = 1
AND socio.id_tipo_pagamento = 1
)
SELECT * FROM main_query
UNION
SELECT NULL, NULL, NULL, NULL, SUM(quota) FROM main_query
GROUP BY id_socio WITH ROLLUP
HAVING nome IS NOT NULL
AND nif IS NOT NULL
AND num_mecanografico IS NOT NULL
OR id_socio IS NULL
,则不是您想要的。