Solr查询找到一个没有其他字母的字母

时间:2015-09-30 14:09:28

标签: solr lucene

我的solr中的文档已经编入索引。我想在轮胎中找到生产者和模特。
我有生成器和模型这样的文件:

Nokian;WR G2 SUV
Nokian;WR SUV
Nokian;V

查询:

((productname:"NOKIAN" OR producer:"NOKIAN") AND (productname:"V" OR description:"V" OR referencenumber:"V"))

但它找到了例如:

"2X NOKIAN 215/55 R17 94V LINE (3)"

因为在此产品中,速度索引为V,此处模型为Line。我的算法将此产品用于Nokian;V而不是Nokian;Line

如何请求solr仅向我提供此V周围没有任何其他字母的产品?

LETNIE 225/45/17 94V NOKIAN V  FINLAND - PŁOTY

这发现很美。它的Nokian;V

3 个答案:

答案 0 :(得分:0)

据我了解你的问题,你需要在每个布尔子句之前放置MUST量词。因此查询将如下所示:

(
  +(productname:"NOKIAN" OR producer:"NOKIAN") AND
  +(productname:"V" OR description:"V" OR referencenumber:"V")
)

答案 1 :(得分:0)

如果您的productname字段属于text类型,则其分析链中包含WordDelimiterFilter。此过滤器的默认行为之一是在字母数字边界上拆分术语,导致:

2X NOKIAN 215/55 R17 94V LINE (3)

生成以下令牌:

2 X NOKIAN 215 55 R 17 94 V LINE 3

(与查询中的“V”匹配)。

您始终可以运行debug=results来获取有关某些内容匹配的原因的说明。我认为在这种特殊情况下,您可以为productname字段构建另一种字段类型,以便较不积极地分析您的模型字符串。

答案 2 :(得分:0)

我解决了这个问题,整理了品牌,模型字典。我用自己的比较器。

    public class MyComparer : IComparer<string>
{
    int IComparer<string>.Compare(string x, string y)
    {
        if (x == y)
        {
            return 0;
        }
        if (x.Contains(y))
        {
            return -1;
        }
        else
        {
            return 1;
        }
    }
}

所有拥有VH的模型现在都在Dcitionary的末尾。它的效果非常好。因为第一个solr搜索了Nokian;Line并且找到了这个产品添加到其他列表alreadyFound并跳过此产品找到的模型。谢谢大家的回复。