3

我正在使用 Solr 3.6.0 进行全文搜索。我在 schema.xml 中定义了以下字段:

<field name="productNumber" type="ngramtext" indexed="true" stored="true" required="true" />  
<field name="additionalTextData" type="text_en" indexed="true" stored="true"/>  

我还定义了以下字段类型:

<fieldType name="ngramtext" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
        <filter class="solr.NGramFilterFactory" minGramSize="2" maxGramSize="3" />
    </analyzer>
    <analyzer type="query">
        <tokenizer class="solr.KeywordTokenizerFactory"/>
        <filter class="solr.LowerCaseFilterFactory"/>
    </analyzer>
</fieldType>

这将创建一个大小为 2 和 3 的标记并将它们放在索引中。非常适合搜索SKU。现在他们进入同一个索引,我知道这可能会产生性能问题。但是我决定在出现性能问题时处理这个问题。对于我现在拥有的数据集,速度非常快(主观来说:))

我还有以下内容:

<uniqueKey>productNumber</uniqueKey>

在 solrconfig.xml 中,我为每个“df”部分放置了附加文本数据:

="df">="df">additionalTextData<

当我执行以下查询时:

select?indent=on&version=2.2&q=productNumber:12&fq=&start=0&rows=10000&fl=productNumber,additionalTextData&wt=json&explainOther&hl.fl

或者

select?indent=on&version=2.2&q=productNumber:12&fq=additionalTextData:*&start=0&rows=10000&fl=productNumber,additionalTextData&wt=json&explainOther&hl.fl

我得到了 2345 个结果,其中一些是重复的。我通过一些 productNumber 搜索,我可以看到它两次或 3 次。为什么会这样?我该如何克服呢?

EDIT1:
我还发现添加:

<filter class="solr.RemoveDuplicatesTokenFilterFactory" />

在所有其他过滤器之后的 ngramtext fieldType 中,并不能解决问题。

根据mbonaci的解决方案1:
而不是:

<field name="productNumber" type="ngramtext" indexed="true" stored="true" required="true" />

地方:

<field name="productNumber" type="string" indexed="true" stored="true" required="true" />
<field name="productNumberCopyField" type="ngramtext" indexed="true" stored="true" required="true" />

在字段标签后添加:

<copyField source="productNumber" dest="productNumberCopyField" />

并且,指定以下查询:

select?indent=on&version=2.2&q= productNumberCopyField :12&fq=additionalTextData:*&start=0&rows=10000&fl=productNumber,additionalTextData&wt=json&explainOther&hl.fl

4

1 回答 1

2

没错,索引分析器将创建 ngram,但 Solr 将使用该 ngram 来形成唯一键。这对你有意义吗?多值唯一键?

例如,如果您有产品密钥tis876a,您最终会得到ti is s8 87 76 6a tis is8 s87 876 76a最终结果。这就是你唯一的钥匙。

因此,只需使用类型lowercase的复制字段(它没有标记化,只是小写)并tis876a用作您的产品密钥(当然,如果它实际上是数据模型中的唯一字段)。

于 2012-06-11T11:16:57.700 回答