[lucene] 请教各位高手,折叠问题在lucene下的解决方法

yaozhan189 2008-11-28
    我搜索出的产品过多,想对其做折叠功能。就是同个公司的产品只显示一个,并计算重复的产品个数。
    不知道用Lucene有什么好的思路可以实现?
    或者需要在Lucene外面实现?
    下面是实例:
    productID     companyId     score       userGrade
    1                1                  0.7898      10
    2                1                  0.7823      10
    3                1                  0.7811      10
    4                2                  0.7900      10
    5                2                  0.7650      10
    6                2                  0.7655      10
    7                3                  0.7922      0
我的排序语句:
new SortField("userGrade", true), SortField.FIELD_SCORE
确保userGrade为10的排前面,一样为10的score高的排前面

排序结果:
    productID     companyId     score       userGrade
    4                2                  0.7900      10
    1                1                  0.7898      10
    2                1                  0.7823      10
    3                1                  0.7811      10
    6                2                  0.7655      10
    5                2                  0.7650      10
    7                3                  0.7922      0

想要的结果:
    productID     companyId     score       userGrade
    4                2                  0.7900      10
    1                1                  0.7898      10
    7                3                  0.7922      0
目前我达到上面结果是通过对companyId遍历,没出现放到Map里面,出现过++
很傻的方法,各位见笑,也麻烦大家多多提点。

如果能通过排序达到:确保userGrade相同时,相同companyId被排在一起,
其中最高的score决定companyId的排列顺序,如下图,这样通过遍历可以
少算很多,呵呵~~~
    productID     companyId     score       userGrade
    4                2                  0.7900      10
    6                2                  0.7655      10
    5                2                  0.7650      10
    1                1                  0.7898      10
    2                1                  0.7823      10
    3                1                  0.7811      10
    7                3                  0.7922      0

周末开心~~大家
moshalanye 2008-11-28
做法很多! filter 可以解决你所有问题!  仔细看下自定义的filter,记得使用fieldcache 很好做的
moshalanye 2008-11-28
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.search.FieldCache;
import org.apache.lucene.search.Filter;

import java.util.BitSet;
import java.io.IOException;


public class CompanyProductFilter extends Filter {
    public BitSet bits(IndexReader reader) throws IOException {

        BitSet bitSet = new BitSet(reader.maxDoc());
        int companyIds[] = FieldCache.DEFAULT.getInts(
                reader,
                "company_id"
        );
        /* 为了确定是否有该公司的东西出现了 */
        BitSet companyIdSet = new BitSet(getMaxInt(companyIds));

        for (int i = 0; i < companyIds.length; i++) {
            /* 该公司没出现 */
            if (!companyIdSet.get(companyIds[i])){    
                /*我这里是帮你将同一个公司的第一个以后的过滤了,这个地方想怎么做,自己可以设计的*/
                bitSet.set(i);
                companyIdSet.set(companyIds[i]);
                /*设置,现在该公司的产品出现了*/
            }
        }    
        return bitSet;
    }

    static int getMaxInt(int num[]) {
        int max = num[0];
        for (int i = 1; i < num.length; i++)
            max = max > num[i] ? max : num[i];
        return max;
    }
}



帮你实现好了,自己可以看看,看是不是满足你的需求   :)
moshalanye 2008-11-28

引用

/* 为了确定是否有该公司的东西出现了 */
        BitSet companyIdSet = new BitSet(getMaxInt(companyIds));

用的时候用对象池会更完美,我就不帮你改了
yaozhan189 2008-12-01
to:moshalanye
谢谢这位兄弟了,我好好看看~~~
有什么不懂再问你~~
moshalanye 2008-12-01
    那个计算重复产品,也在filter里面做,用翻转放在哪个对象中,你可以自己控制,我这边只给了你个做法
yaozhan189 2008-12-01
十分感谢~~
用反转?
我想想先~~
wu_quanyin 2011-01-06
yaozhan189 写道
    我搜索出的产品过多,想对其做折叠功能。就是同个公司的产品只显示一个,并计算重复的产品个数。
    不知道用Lucene有什么好的思路可以实现?
    或者需要在Lucene外面实现?
    下面是实例:
    productID     companyId     score       userGrade
    1                1                  0.7898      10
    2                1                  0.7823      10
    3                1                  0.7811      10
    4                2                  0.7900      10
    5                2                  0.7650      10
    6                2                  0.7655      10
    7                3                  0.7922      0
我的排序语句:
new SortField("userGrade", true), SortField.FIELD_SCORE
确保userGrade为10的排前面,一样为10的score高的排前面

排序结果:
    productID     companyId     score       userGrade
    4                2                  0.7900      10
    1                1                  0.7898      10
    2                1                  0.7823      10
    3                1                  0.7811      10
    6                2                  0.7655      10
    5                2                  0.7650      10
    7                3                  0.7922      0

想要的结果:
    productID     companyId     score       userGrade
    4                2                  0.7900      10
    1                1                  0.7898      10
    7                3                  0.7922      0
目前我达到上面结果是通过对companyId遍历,没出现放到Map里面,出现过++
很傻的方法,各位见笑,也麻烦大家多多提点。

如果能通过排序达到:确保userGrade相同时,相同companyId被排在一起,
其中最高的score决定companyId的排列顺序,如下图,这样通过遍历可以
少算很多,呵呵~~~
    productID     companyId     score       userGrade
    4                2                  0.7900      10
    6                2                  0.7655      10
    5                2                  0.7650      10
    1                1                  0.7898      10
    2                1                  0.7823      10
    3                1                  0.7811      10
    7                3                  0.7922      0

周末开心~~大家



这样做不会遇到http://www.iteye.com/problems/56767 问题吗???
Global site tag (gtag.js) - Google Analytics