当前位置: 首页 > 工具软件 > Lucene4c > 使用案例 >

java lucene搜索引擎的实现

宓跃
2023-12-01

1.一次性查询数据库表中 所有用于作为关键字搜索字段的所有记录,

public static ResultSet getResult(String storeId) throws Exception {  
        Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver").newInstance();  
        String url = "jdbc:sqlserver://19.***.178.***:1433;DatabaseName=***";  
        String userName = "sa";  
        String password = "*********";  
        Connection conn = DriverManager.getConnection(url, userName, password);  
        Statement stmt = conn.createStatement();  
        String sql = "select * from (select row_number()over(ORDER BY getdate() desc) as indexId ," +
                "u.pkid  as unitId, u.Name as unitName,u.Address," +
                "u.Tags as unitTags,u.Introduction, e.Content,a.Value," +
                "ut.typeName as typeName from Unit u " +
                "left join UnitEvaluate e on e.UnitID = u.pkid left join " +
                "UnitAttribute a on a.UnitId=u.pkid left join " +
                "(select ty.name as typeName,a.unitid as unitid from UnitType ty " +
                "left join Attribute b on b.unitTypeId= ty.pkid " +
                "left join AttributeValue v on v.AttributeId= b.pkid " +
                "right join UnitAttribute a on a.AttributeValueID= v.pkid) as ut on " +
                "ut.unitid = u.pkid) newView";  
        ResultSet rs = stmt.executeQuery(sql + " where newView.indexId > '" + storeId + "'order by newView.indexId");  
        return rs;  
    }  

ps:多表查询  工作量最大的地方  烧脑

==================================

sql  结果集 测试数据24336条

24327    6CA25FF0-73D7-47DD-9D14-FFF3E3088D97    文华羽绒    佛山市顺德区大良高坎路近涌街21号    羽绒服,鹅绒,鸭绒,灰绒,白绒,    <span style="font-size:18px;">&nbsp;本店销售各类型羽绒服装,欢迎前来选购。</span>    NULL    服装店    购在大良
24328    7AC1A5E6-14B6-4BF1-85CF-FFF45AD905CB    大良东铁装饰材料店    佛山市顺德区大良东康路珠江楼B座115    NULL    NULL    NULL    服装店    购在大良
24329    315D155A-EE3D-4ABD-9042-FFF572BF1721    海诺贸易有限公司    佛山市顺德区大良新桂路和桂街72号    NULL    NULL    NULL    综合性贸易企业    企在大良
24330    89CB91A5-48D2-4390-8D8F-FFF61C375C42    大良顺峰五金塑料制品厂    顺德区大良街道凤翔工业区30号-1-C1    顺德区大良街道凤翔工业区30号-1-C1    NULL    NULL    办公机械五金工具    企在大良
24331    79C09F8C-DF6D-4EFD-8C9E-FFF83F3E0C99    万皆贸易有限公司    佛山市顺德区大良大门沙圩队工业用地办公楼2楼之三    NULL    NULL    NULL    综合性贸易企业    企在大良
24332    AF99B46C-1B45-4421-9A17-FFF8C266A6B4    仅一味<body ONLOAD=alert(42873)>    顺德区大良购书中心    仅一味美食 串串香 麻辣烫 酸辣粉    88888    NULL    NULL    NULL
24333    F7A6EC1B-F2E3-4559-8F39-FFF9A035A79B    大良医院    佛山市顺德区大良环市南路2号    口腔科、乳腺病专科、肛肠科、泌尿外科、创伤外科、老年病科、中医正骨科、妇幼保健科、脊椎病康复治疗、美容    <span style="font-size:18px;"> </span><p><span style="font-size:18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 大良医院坐落于顺德区中心城区南区(大良环市南路2号,顺德区汽车站东侧,紧邻105国道)地理位置优越,交通便利。医院始建于1958年,由原仁爱医院、新球医院、锦湖医院合并而成。现已发展为一所集医疗、教学、科研、预防保健、康复和社区服务等功能为一体的现代化的“二级甲等综合性医院”。医院的下伸网点:仁爱门诊、锦湖门诊、新球门诊、鉴海门诊以及大门、苏岗、金榜、敬老、环市北、云路、新滘、沙头、古鉴、逢沙和古楼等社区卫生服务站点遍布大良街道各村、居委。 </span></p><p><span style="font-size:18px;">&nbsp;</span></p><p><span style="font-size:18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 医院技术力量雄厚,现有在职员工700余人。其中,具有高级专业技术职称的35人,中级职称的130人。年门急诊量120余万人次,开放住院病床350张。</span></p><p><span style="font-size:18px;">&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 医院主要设备有:飞利浦螺旋CT、DR、C 臂X光机、进口意大利高频钼靶X线乳腺检查仪、日立胃肠 X射线机、进口芬兰全景口腔X光机、进口牙科综合治疗台、GE彩色多普勒超声诊断仪、动态心电图仪、多普勒脑电地形仪、日立电子胃镜、腹腔镜、纤维喉镜、前列腺电切刀、体外碎石机、全自动生化分析仪、美国雅培全自动免疫发生分析仪、五分类血球计数仪、自动血凝仪、心电监护仪、进口呼吸机、除颤仪等。<br /></span></p><p><span style="font-size:18px;">&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; 医院坚持大专科发展方向。其中口腔科、乳腺病专科、肛肠科、泌尿外科、创伤外科、老年病科、中医正骨科、妇幼保健科、脊椎病康复治疗、美容等专科在本地区具有较大优势。</span></p><p><br /><span style="font-size:18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;近年来,医院先后引进了多名学科带头人及高素质人才,技术力量得到了进一步增强。新医院建成并投入使用后,医院的设施更齐全、设备更加现代化。医院坚持全心全意为人民服务的办院宗旨,坚持“以病人为中心”的服务理念,不断强化科学管理,提高医疗质量,为群众提供优质安全的服务,受到社会各界的好评和患者的信赖。</span></p><p><span style="font-size:18px;">&nbsp;</span></p><span style="font-size:18px;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 大良医院正努力朝着一流服务、一流技术、一流管理的现代化医院的目标迈进,将为全面建设小康社会和保障广大人民群众身体健康争做更大的贡献! </span>    NULL    综合性医院    康在大良
24334    D7208D3A-9FAF-40CC-958F-FFFC64DE3621    大良戴明辉杂货店    佛山市顺德区大良南国中路岭岚花园碧翠轩31号铺    NULL    NULL    NULL    便利店/日用品店    购在大良
24335    B1EC0C21-2F0B-4E97-B78F-FFFCA3B3B5AD    大良梁雁娉服装店    佛山市顺德区大良观光路十六街2巷2号之二    NULL    NULL    NULL    服装店    购在大良
24336    2C4B1C73-0828-42A9-8A59-FFFEBD104350    宝天源茶庄    顺德区大良(南华)果栏路2号首层3号    NULL    NULL    NULL    其它玩乐场所    闲在大良

..................................................................................................................................................

===================

对每条记录建立索引,并将最后一条记录的索引id存储到indexIds.txt文件中

public static void buildIndex(String indexFile, String storeIdFile) {  
        try {  
            String path = indexFile;//索引文件的存放路径  
            String storeIdPath = storeIdFile;//存储ID的路径  
            String storeId = "";  
            storeId = getStoreId(storeIdPath);  
            ResultSet rs = getResult(storeId);  
            indexBuilding(path, storeIdPath, rs);  
            storeId = getStoreId(storeIdPath);  
            System.out.println(storeId);//打印出这次存储起来的ID  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
 

 // 将ID写入到磁盘文件中  
    public static boolean writeStoreId(String path, String indexId) {  
        boolean b = false;  
        try {  
            File file = new File(path);  
            if (!file.exists()) {  
                file.createNewFile();  
            }  
            FileWriter fw = new FileWriter(path);  
            PrintWriter out = new PrintWriter(fw);  
            out.write(indexId);  
            out.close();  
            fw.close();  
            b = true;  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        return b;  
    } 


2.  当新插入一条记录时,再建立索引时不必再对所有数据重新建一遍索引,

public static boolean indexBuilding(String path, String storeIdPath, ResultSet rs) {  
        try {  
            Analyzer luceneAnalyzer = new StandardAnalyzer();  
            // 取得存储起来的ID,以判定是增量索引还是重新索引  
            boolean isEmpty = true;  
            try {  
                File file = new File(storeIdPath);  
                if (!file.exists()) {  
                    file.createNewFile();  
                }  
                FileReader fr = new FileReader(storeIdPath);  
                BufferedReader br = new BufferedReader(fr);  
                if (br.readLine() != null) {  
                    isEmpty = false;  
                }  
                br.close();  
                fr.close();  
            } catch (IOException e) {  
                e.printStackTrace();  
            }  
            //isEmpty=false表示增量索引  
            IndexWriter writer = new IndexWriter(path, luceneAnalyzer, isEmpty);  
            String storeId = "";  
            boolean indexFlag = false;
            
             String unitId;
             String unitName;// Name 商户名称
             String address; // Address 商户地址
             String unitTags; // Tags 商户标签
             String Introduction;// Introduction 商户简介
             String Content;// [Content] 评论内容
             String Value;// Value 属性归类
             String unTypeName;// Name 类型名
             String indexId;
            
            while (rs.next()) {
                indexId=rs.getString("indexId");
                unitId=rs.getString("unitId");
                unitName = rs.getString("unitName");  
                address = rs.getString("address");  
                unitTags = rs.getString("unitTags");
                Introduction = rs.getString("Introduction");
                Content = rs.getString("Content");
                Value = rs.getString("Value");
                unTypeName = rs.getString("typeName");
                
                writer.addDocument(getDocument(indexId,unitId,unitName,address,unitTags,Introduction,
                        Content,Value,unTypeName));  
                storeId = indexId; 
                indexFlag = true;  
            }  
            writer.optimize();  
            writer.close();  
            if (indexFlag) {  
                // 将最后一个的ID存到磁盘文件中  
                writeStoreId(storeIdPath, storeId);  
            }  
            return true;  
        } catch (Exception e) {  
            e.printStackTrace();  
            System.out.println("出错了" + e.getClass() + "\n   错误信息为:   " + e.getMessage());  
            return false;  
        }  
 
    } 

3. 可根据存放在indexIds.txt文件中的索引id查出新插入的数据,只对新增的数据新建索引,并把新增的索引追加到原来的索引文件中

Demo测试:

public static void main(String[] args) throws Exception {  
        // 创建索引  
        IndexUtils.buildIndex(indexFile, storeIdFile);  
        IndexSearcher indexSearcher = new IndexSearcher(indexFile);  
       // String key = IndexUtils.ik_CAnalyzer("");  
        Date date1 ;
        List<IndexResult> list ;
        Date date2 ;  
 
        //多条件查询  
        String[] fields = { "unitName", "address","unitTags","introduction","content",
                "value","unTypeName" }; 
        String keys="都市";
        date1 = new Date();  
        list = IndexUtils.queryByMultiFileds(indexSearcher, fields, keys);  
        date2 = new Date();  
        System.out.println("耗时:" + (date2.getTime() - date1.getTime()) + "ms\n" + list.size()  
                + "条\n=============================");  
        printResults(list);  
       
    }  


//字段查询  
@SuppressWarnings("deprecation")  
public static List<IndexResult> queryByMultiFileds(IndexSearcher indexSearcher,  
        String[] fields, String key) {  
    try {  
        MultiFieldQueryParser mfq = new MultiFieldQueryParser(fields, new StandardAnalyzer());  
        Query query = mfq.parse(key);  
        Hits hits = indexSearcher.search(query);  
        List<IndexResult> list = new ArrayList<IndexResult>();  
        for (int i = 0; i < hits.length(); i++) {  
            list.add(getIndexResult(hits.doc(i)));  
        }  

        return list;  
    } catch (ParseException e) {  
        e.printStackTrace();  
    } catch (IOException e) {  
        e.printStackTrace();  
    }  
    return null;  


耗时:50ms
246条
===============================多条件查询
21DB0D44-0366-4539-B915-00101A6215BF,都市丽人服装店,佛山市顺德区大良华盖路80号,女性内衣,内衣,内裤,防寒内衣,文胸,胸围--->0
21DB0D44-0366-4539-B915-00101A6215BF,都市丽人服装店,佛山市顺德区大良华盖路80号,女性内衣,内衣,内裤,防寒内衣,文胸,胸围--->1
21DB0D44-0366-4539-B915-00101A6215BF,都市丽人服装店,佛山市顺德区大良华盖路80号,女性内衣,内衣,内裤,防寒内衣,文胸,胸围--->2
21DB0D44-0366-4539-B915-00101A6215BF,都市丽人服装店,佛山市顺德区大良华盖路80号,女性内衣,内衣,内裤,防寒内衣,文胸,胸围--->3
21DB0D44-0366-4539-B915-00101A6215BF,都市丽人服装店,佛山市顺德区大良华盖路80号,女性内衣,内衣,内裤,防寒内衣,文胸,胸围--->4
64884D9E-674F-4E5B-A7AF-264290EE846D,都市丽人内衣店,佛山市顺德区大良华盖路137号首层,女性内衣,内衣,内裤,防寒内衣,文胸,胸围--->5
76E31FC6-3CA0-4C0C-B75A-1B0B9745234B,都市人皮具店,佛山市顺德区大良华盖路17号,提包,皮包,挎包,时尚包,工具包,工作包,鞋子,皮带,钱包,皮鞋,高跟鞋,运动鞋,儿童鞋,跑鞋,布鞋,凉鞋--->6
97411A17-7862-40C0-B3DC-40F09B90891A,都市丽人家居服饰店,佛山市顺德区大良华盖路82号,女性内衣,内衣,内裤,防寒内衣,文胸,胸围--->7
455521E2-6DC9-48DF-A378-00FE23B168A3,大良府又都市理发店,佛山市顺德区大良东宏路40号, --->8
455521E2-6DC9-48DF-A378-00FE23B168A3,大良府又都市理发店,佛山市顺德区大良东宏路40号, --->9
9A6840EF-80E9-438A-8138-DF7FF8470D50,大良都市贝贝母婴用品店,佛山市顺德区大良新桂路明日华府79号铺, --->10
4C835F04-D400-4CB2-9AF7-DA0F3E8BE3B6,柳州螺蛳粉,都市玫瑰苑, --->11
C4425BA2-2E5E-462C-BF63-404FAEE02247,刘汉客饮食店,延年路都市玫瑰苑47号, --->12
C4425BA2-2E5E-462C-BF63-404FAEE02247,刘汉客饮食店,延年路都市玫瑰苑47号, --->13
D01616E7-68C9-4B12-9AFE-11ADD72CC4D2,亿(一)品茶艺馆,大良延年南路都市玫瑰苑9.10号商铺, --->14
11A7FFC6-FA7B-4B97-9D99-4BF2C55663C6,晗香源,顺德区大良延年路都市玫瑰苑3号铺, --->15
0E1F5E7E-7AE4-47E9-BA3E-688D90685A47,渝唐饭食店,大良延年南路9号都市玫瑰园, --->16
0E1F5E7E-7AE4-47E9-BA3E-688D90685A47,渝唐饭食店,大良延年南路9号都市玫瑰园, --->17
24A0AD3A-6215-4BA8-96E9-AB2BC5DE4EFA,大良烧腊,大良延年路都市玫瑰园50号, --->18.......................略

 类似资料: