Xml 为什么我会得到以及如何从solr结果中删除关于我的唯一字段的重复项?

Xml 为什么我会得到以及如何从solr结果中删除关于我的唯一字段的重复项?,xml,solr,Xml,Solr,我正在使用Solr3.6.0进行全文搜索。 在my schema.xml中定义了以下字段: <field name="productNumber" type="ngramtext" indexed="true" stored="true" required="true" /> <field name="additionalTextData" type="text_en" indexed="true" stored="true"/> 我还定义了以下字段类型:

我正在使用Solr3.6.0进行全文搜索。 在my 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>

. 现在它们放在同一个索引中,我知道这可能会造成性能问题。但我决定在性能问题出现时处理这个问题。对于我现在拥有的数据集,速度非常快(主观上说:)

我还有以下几点:

<uniqueKey>productNumber</uniqueKey>
productNumber
在solrconfig.xml中,我为每个“df”部分放置了额外的文本数据:

=“df”>=“df”>附加文本数据<
当我执行以下查询时:

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

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

我得到了2345个结果,其中一些结果重复出现。我通过一些productNumber搜索,我可以看到它两到三次。为什么会发生这种情况?我怎样才能克服这个问题?

EDIT1:
我还发现,添加:

<filter class="solr.RemoveDuplicatesTokenFilterFactory" />

在ngramtext字段类型中,在所有其他筛选器之后,无法解决此问题

根据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" />

在fields标记后添加:

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

并且,指定以下查询:


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

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

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


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

唯一密钥不应该是ngram。使用一个单独的字段,你不会索引。或者更简单(我不知道为什么要标记产品编号),只需将
productNumber
类型设置为
int
string
。好的,我明白了,
sku
,但是,请保持
productNumber
不变,并添加额外的字段
productID
,您不会将其分析并用作
uniqueKey
。productNumber是混合字符(字母、数字和特殊字符)。我需要solr返回productNumber任意2或3个连续字符的查询。这就是为什么它是一个ngram。ngram类型与该领域的独特性有什么关系?据我所知,索引分析器将为每个productNumber创建NGRAM。查询分析器应该检查索引中是否存在ngram,并返回相应的完整productNumber。谢谢!这就解决了问题。如果有人想看到具体的实现,请在问题的末尾查找它。干杯感谢您以解决方案示例进行报告。我很高兴我的建议很有帮助。
<copyField source="productNumber" dest="productNumberCopyField" />