首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

利用SOLR筹建企业搜索平台 之五(solrj)

2012-06-26 
利用SOLR搭建企业搜索平台 之五(solrj)利用SOLR搭建企业搜索平台 之五(solrj)博客分类:?solrSolr企业应用Q

利用SOLR搭建企业搜索平台 之五(solrj)

利用SOLR搭建企业搜索平台 之五(solrj)博客分类:?
  • solrSolr企业应用QtApache编程http://www.dzxiaoshuo.com?

    相信很多人,在准备提交数据让solr建立索引的那刻,很纳闷,尽管看了不少网上的一些文章,但是我想依然还是有不少不理解的地方。?
    比如提交一个xml,采用post方式,尽管有些文章说了可以采用httpclient。但是我那个时候,还不是很理解,当然现在看来其实也没有什么了。但是对于一个刚入门solr的初学者,我想讲讲关于solr1.3的 solrj( sorlr J 目前使用二进制的格式作为默认的格式。对于solr1.2的用户通过显示的设置才能使用XML格式。)!?

    先上一个例子:?
    Java代码??利用SOLR筹建企业搜索平台 之五(solrj)
    1. public?static?final?String?SOLR_URL?=?"http://localhost/solr/core0";??
    2. public?static?void?commit()?{??
    3. ????Date?date?=?new?Date();??
    4. ????SolrServer?solr?=?null;??
    5. ????try?{??
    6. ????????solr?=?new?CommonsHttpSolrServer(SOLR_URL);??
    7. ????}?catch?(MalformedURLException?e1)?{??
    8. ????????e1.printStackTrace();??
    9. ????}??
    10. for?(int?i?=?0;?i?<?10000;?i++)?{??
    11. ????????????SolrInputDocument?sid?=?new?SolrInputDocument();??
    12. ????????????sid.addField("id",?i);??
    13. ????????????sid.addField("name",?"struts+hibernate+spring?开发大全"?+?i);??
    14. ????????????sid.addField("summary",?"三种框架的综合应用"?+?i);??
    15. ????????????sid.addField("author",?"李良杰"?+?i);??
    16. ????????????sid.addField("date",?new?Date());??
    17. ????????????sid.addField("content",?"高级应用类书籍"?+?i);??
    18. ????????????sid.addField("keywords",?"SSH"?+?i);??
    19. ????????????try?{??
    20. ????????????????solr.add(sid);??
    21. ????????????}?catch?(MalformedURLException?e)?{??
    22. ????????????????e.printStackTrace();??
    23. ????????????}?catch?(SolrServerException?e)?{??
    24. ????????????????e.printStackTrace();??
    25. ????????????}?catch?(IOException?e)?{??
    26. ????????????????e.printStackTrace();??
    27. ????????????}??
    28. ????????????System.out.println(i);??
    29. ????????????if?(i?==?999)???
    30. ????????????????System.out.println((new?Date().getTime()?-?date.getTime())?/?60000?+?"分钟");??
    31. ????????}??
    32. ????????try?{??
    33. ????????????solr.commit();??
    34. ????????}?catch?(SolrServerException?e)?{??
    35. ????????????e.printStackTrace();??
    36. ????????}?catch?(IOException?e)?{??
    37. ????????????e.printStackTrace();??
    38. ????????}??
    39. }??


    上面这段代码的意思是:利用for提交10000个document,并打印提交10000所需的时间。?
    1》CommonsHttpSolrServer 使用HTTPClient 和solr服务器进行通信。?

    2》CommonsHttpSorlrServer 允许设置链接属性。?
    Java代码??利用SOLR筹建企业搜索平台 之五(solrj)
    1. server.setSoTimeout(1000);??//?socket?read?timeout????
    2. ??server.setConnectionTimeout(100);????
    3. ??server.setDefaultMaxConnectionsPerHost(100);????
    4. ??server.setMaxTotalConnections(100);????
    5. ??server.setFollowRedirects(false);??//?defaults?to?false????
    6. ??//?allowCompression?defaults?to?false.????
    7. ??//?Server?side?must?support?gzip?or?deflate?for?this?to?have?any?effect.????
    8. ??server.setAllowCompression(true);????
    9. ??server.setMaxRetries(1);?//?defaults?to?0.??>?1?not?recommended.??
    ??

    3》实现SolrServer接口的另一个类:EmbeddedSorrServer,它不需要http连接。?

    4》在构造document的时候,可以一个一个添加到solrServer,也可以构建一个包含document的Collection,将Collection添加到solrServer,然后commit。?

    5》也可以构造一个跟document匹配的JavaBean进行提交?
    ????? 使用 java 注释创建java bean。@Field ,可以被用在域上,或者是setter方法上。如果一个域的名称跟bean的名称是不一样的,那么在java注释中填写别名,具体的,可以参照下面的域categories??????????
    Java代码??利用SOLR筹建企业搜索平台 之五(solrj)
    1. import?org.apache.solr.client.solrj.beans.Field;????
    2. ?public?class?Item?{????
    3. ????@Field????
    4. ????String?id;????
    5. ????@Field("cat")????
    6. ????String[]?categories;?????
    7. ????@Field????
    8. ????List<String>?features;?????
    9. ??}????

    java注释也可以使用在setter方法上,如下面的例子:?
    Java代码??利用SOLR筹建企业搜索平台 之五(solrj)
    1. @Field("cat")????
    2. ?public?void?setCategory(String[]?c){????
    3. ?????this.categories?=?c;????
    4. ?}??
    ??
    这里应该要有一个相对的,get方法(没有加java注释的)来读取属性?
    Java代码??利用SOLR筹建企业搜索平台 之五(solrj)
    1. Item?item?=?new?Item();????
    2. item.id?=?"one";????
    3. item.categories?=??new?String[]?{?"aaa",?"bbb",?"ccc"?};???

    添加给solr??????????
    Java代码??利用SOLR筹建企业搜索平台 之五(solrj)
    1. server.addBean(item);??
    ??
    将多个bean提交给solr?
    Java代码??利用SOLR筹建企业搜索平台 之五(solrj)
    1. List<Item>?beans?;????
    2. //add?Item?objects?to?the?list????
    3. server.addBeans(beans);??
    ?????
    注意: 你可以重复使用SolrServer,这样可以提高性能。?

    6》?
    Java代码??利用SOLR筹建企业搜索平台 之五(solrj)
    1. public?static?void?update()?{??
    2. ????SolrServer?solrServer?=?null;??
    3. ????try?{??
    4. ????????solrServer?=?new?CommonsHttpSolrServer(SOLR_URL);??
    5. ????}?catch?(MalformedURLException?e)?{??
    6. ????????e.printStackTrace();??
    7. ????}??
    8. ????UpdateRequest?updateRequest?=?new?UpdateRequest();??
    9. ????SolrInputDocument?sid?=?new?SolrInputDocument();??
    10. ????sid.addField("id",?100000);??
    11. ????sid.addField("name",?"struts+hibernate+spring?开发大全");??
    12. ????sid.addField("summary",?"三种框架的综合应用");??
    13. ????sid.addField("author",?"李良杰");??
    14. ????sid.addField("date",?new?Date());??
    15. ????sid.addField("content",?"高级应用类书籍");??
    16. ????sid.addField("keywords",?"SSH");??
    17. ????updateRequest.setAction(UpdateRequest.ACTION.COMMIT,?false,?false);????
    18. ????updateRequest.add(sid);????
    19. ????try?{??
    20. ????????UpdateResponse?updateResponse?=?updateRequest.process(solrServer);??
    21. ????????System.out.println(updateResponse.getStatus());??
    22. ????}?catch?(SolrServerException?e)?{??
    23. ????????e.printStackTrace();??
    24. ????}?catch?(IOException?e)?{??
    25. ????????e.printStackTrace();??
    26. ????}??
    27. }??

    提交一个document,采用更新方式,注意:Java代码??利用SOLR筹建企业搜索平台 之五(solrj)
    1. updateRequest.setAction(UpdateRequest.ACTION.COMMIT,?false,?false);??


    7》Java代码??利用SOLR筹建企业搜索平台 之五(solrj)
    1. public?static?void?query()?{??
    2. ????SolrServer?solr?=?null;??
    3. ????try?{??
    4. ????????solr?=?new?CommonsHttpSolrServer(SOLR_URL);??
    5. ????}?catch?(MalformedURLException?e)?{??
    6. ????????e.printStackTrace();??
    7. ????????return;??
    8. ????}??
    9. ????//?http://localhost:8983/solr/spellCheckCompRH?q=epod&spellcheck=on&spellcheck.build=true??
    10. ????ModifiableSolrParams?params?=?new?ModifiableSolrParams();??
    11. ????params.set("qt",?"/spellCheckCompRH");??
    12. ????params.set("q",?"编程");??
    13. ????params.set("spellcheck",?"on");??
    14. ????params.set("spellcheck.build",?"true");??
    15. ????QueryResponse?response?=?null;??
    16. ????try?{??
    17. ????????response?=?solr.query(params);??
    18. ????}?catch?(SolrServerException?e)?{??
    19. ????????e.printStackTrace();??
    20. ????????return;??
    21. ????}??
    22. ????System.out.println("response?=?"?+?response);??
    23. }??

    这是一个查询方法。关键字:“编程”。关于查询的关键字,请参见slor wikihttp://wiki.apache.org/solr/QueryParametersIndex,或等待我的博客更新,在后面会有篇文章详细讲这个问题!?

    8》给solr的索引文件手动进行优化,Java代码??利用SOLR筹建企业搜索平台 之五(solrj)
    1. solr.optimize();??


    9》solrJ 提供了一组API,来帮助我们创建查询,下面是一个faceted query的例子。?
    Java代码?
    Java代码??利用SOLR筹建企业搜索平台 之五(solrj)
    1. SolrServer?server?=?getSolrServer();????
    2. SolrQuery?solrQuery?=?new??SolrQuery().setQuery("ipod").setFacet(true).setFacetMinCount(1).setFacetLimit(8).??????addFacetField("category").addFacetField("inStock");??????
    3. QueryResponse?rsp?=?server.query(solrQuery);??
    ??
    所有的 setter/add 方法都是返回它自己本身的实例,所以就像你所看到的一样,上面的用法是链式的。?