`
蔚蓝搁浅
  • 浏览: 10000 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
社区版块
存档分类
最新评论
  • transist: 不知道近实时搜索是如何实现的?
    Solr

SolrJ实例

阅读更多

使用SolrJ操作Solr会比利用httpClient来操作Solr要简单。SolrJ是封装了httpClient方法,来操作solr的API的。SolrJ底层还是通过使用httpClient中的方法来完成Solr的操作。

1、 首先,你需要添加如下jar包

clip_image012

这些Jar包是在\dist\solrj-lib下。

 

2、 其次,建立一个简单的测试类,完成Server对象的相关方法的测试工作,代码如下:

package com.admomo.test;
<!--CRLF-->
 
<!--CRLF-->
import java.io.IOException;
<!--CRLF-->
import java.net.MalformedURLException;
<!--CRLF-->
import java.util.ArrayList;
<!--CRLF-->
import java.util.Collection;
<!--CRLF-->
import java.util.List;
<!--CRLF-->
import org.apache.solr.client.solrj.SolrQuery;
<!--CRLF-->
import org.apache.solr.client.solrj.SolrServer;
<!--CRLF-->
import org.apache.solr.client.solrj.SolrServerException;
<!--CRLF-->
import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer;
<!--CRLF-->
import org.apache.solr.client.solrj.response.QueryResponse;
<!--CRLF-->
import org.apache.solr.client.solrj.response.UpdateResponse;
<!--CRLF-->
import org.apache.solr.common.SolrDocumentList;
<!--CRLF-->
import org.apache.solr.common.SolrInputDocument;
<!--CRLF-->
import org.apache.solr.common.params.ModifiableSolrParams;
<!--CRLF-->
import org.apache.solr.common.params.SolrParams;
<!--CRLF-->
import org.junit.After;
<!--CRLF-->
import org.junit.Before;
<!--CRLF-->
import org.junit.Test;
<!--CRLF-->
import com.hoo.entity.Index;
<!--CRLF-->
 
<!--CRLF-->
/**
<!--CRLF-->
 * <b>function:</b> Server TestCase
<!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF-->
 */
<!--CRLF-->
public class ServerTest {
<!--CRLF-->
    
<!--CRLF-->
    private SolrServer server;
<!--CRLF-->
    private CommonsHttpSolrServer httpServer;
<!--CRLF-->
    
<!--CRLF-->
    private static final String DEFAULT_URL = "http://localhost:8983/solr/";
<!--CRLF-->
    
<!--CRLF-->
    @Before
<!--CRLF-->
    public void init() {
<!--CRLF-->
        try {
<!--CRLF-->
            server = new CommonsHttpSolrServer(DEFAULT_URL);
<!--CRLF-->
            httpServer = new CommonsHttpSolrServer(DEFAULT_URL);
<!--CRLF-->
        } catch (MalformedURLException e) {
<!--CRLF-->
            e.printStackTrace();
<!--CRLF-->
        }
<!--CRLF-->
    }
<!--CRLF-->
    
<!--CRLF-->
    @After
<!--CRLF-->
    public void destory() {
<!--CRLF-->
        server = null;
<!--CRLF-->
        httpServer = null;
<!--CRLF-->
        System.runFinalization();
<!--CRLF-->
        System.gc();
<!--CRLF-->
    }
<!--CRLF-->
    
<!--CRLF-->
    public final void fail(Object o) {
<!--CRLF-->
        System.out.println(o);
<!--CRLF-->
    }
<!--CRLF-->
    
<!--CRLF-->
    /**
<!--CRLF-->
     * <b>function:</b> 测试是否创建server对象成功
<!--CRLF--><!--CRLF--><!--CRLF-->
     */
<!--CRLF-->
    @Test
<!--CRLF-->
    public void server() {
<!--CRLF-->
        fail(server);
<!--CRLF-->
        fail(httpServer);
<!--CRLF-->
    }
<!--CRLF-->
 
<!--CRLF-->
    /**
<!--CRLF-->
     * <b>function:</b> 根据query参数查询索引
<!--CRLF--><!--CRLF--><!--CRLF-->
     * @param query
<!--CRLF-->
     */
<!--CRLF-->
    public void query(String query) {
<!--CRLF-->
        SolrParams params = new SolrQuery(query);
<!--CRLF-->
        
<!--CRLF-->
        try {
<!--CRLF-->
            QueryResponse response = server.query(params);
<!--CRLF-->
            
<!--CRLF-->
            SolrDocumentList list = response.getResults();
<!--CRLF-->
            for (int i = 0; i < list.size(); i++) {
<!--CRLF-->
                fail(list.get(i));
<!--CRLF-->
            }
<!--CRLF-->
        } catch (SolrServerException e) {
<!--CRLF-->
            e.printStackTrace();
<!--CRLF-->
        } 
<!--CRLF-->
    }
<!--CRLF-->
}
<!--CRLF-->

测试运行server case方法,如果成功创建对象,那你就成功的链接到。

注意:在运行本方法之前,请启动你的solr官方自动的项目。http://localhost:8983/solr/保证能够成功访问这个工程。因为接下来的所有工作都是围绕这个solr工程完成的。如果你现在还不知道,怎么部署、发布官方solr工程,请参考前面的具体章节。

 

3、 Server的有关配置选项参数,server是CommonsHttpSolrServer的实例

server.setSoTimeout(1000); // socket read timeout 
<!--CRLF-->
server.setConnectionTimeout(100); 
<!--CRLF-->
server.setDefaultMaxConnectionsPerHost(100); 
<!--CRLF-->
server.setMaxTotalConnections(100); 
<!--CRLF-->
server.setFollowRedirects(false); // defaults to false 
<!--CRLF-->
// allowCompression defaults to false. 
<!--CRLF-->
// Server side must support gzip or deflate for this to have any effect. 
<!--CRLF-->
server.setAllowCompression(true); 
<!--CRLF-->
server.setMaxRetries(1); // defaults to 0.  > 1 not recommended. 
<!--CRLF-->
 
<!--CRLF-->
//sorlr J 目前使用二进制的格式作为默认的格式。对于solr1.2的用户通过显示的设置才能使用XML格式。
<!--CRLF-->
server.setParser(new XMLResponseParser());
<!--CRLF-->
 
<!--CRLF-->
//二进制流输出格式
<!--CRLF-->
//server.setRequestWriter(new BinaryRequestWriter());
<!--CRLF-->

 

4、 利用SolrJ完成Index Document的添加操作

/**
<!--CRLF-->
 * <b>function:</b> 添加doc文档
<!--CRLF--><!--CRLF--><!--CRLF-->
 */
<!--CRLF-->
@Test
<!--CRLF-->
public void addDoc() {
<!--CRLF-->
    //创建doc文档
<!--CRLF-->
     SolrInputDocument doc = new SolrInputDocument();
<!--CRLF-->
    doc.addField("id", 1);
<!--CRLF-->
    doc.addField("name", "Solr Input Document");
<!--CRLF-->
    doc.addField("manu", "this is SolrInputDocument content");
<!--CRLF-->
    
<!--CRLF-->
    try {
<!--CRLF-->
        //添加一个doc文档
<!--CRLF-->
        UpdateResponse response = server.add(doc);
<!--CRLF-->
        fail(server.commit());//commit后才保存到索引库
<!--CRLF-->
        fail(response);
<!--CRLF-->
        fail("query time:" + response.getQTime());
<!--CRLF-->
        fail("Elapsed Time:" + response.getElapsedTime());
<!--CRLF-->
        fail("status:" + response.getStatus());
<!--CRLF-->
    } catch (SolrServerException e) {
<!--CRLF-->
        e.printStackTrace();
<!--CRLF-->
    } catch (IOException e) {
<!--CRLF-->
        e.printStackTrace();
<!--CRLF-->
    }
<!--CRLF-->
    query("name:solr");
<!--CRLF-->
}
<!--CRLF-->

在apache-solr-4.0\example\solr\conf目录下的schema.xml中可以找到有关于field属性的配置,schema.xml中的field就和上面Document文档中的field(id、name、manu)对应。如果出现ERROR:unknown field 'xxxx'就表示你设置的这个field在schema.xml中不存在。如果一定要使用这个field,请你在schema.xml中进行filed元素的配置。具体请参考前面的章节。

注意:在schema.xml中配置了uniqueKey为id,就表示id是唯一的。如果在添加Document的时候,id重复添加。那么后面添加的相同id的doc会覆盖前面的doc,类似于update更新操作,而不会出现重复的数据。

 

5、 利用SolrJ添加多个Document,即添加文档集合

/**
<!--CRLF-->
 * <b>function:</b> 添加docs文档集合
<!--CRLF--><!--CRLF--><!--CRLF-->
 */
<!--CRLF-->
@Test
<!--CRLF-->
public void addDocs() {
<!--CRLF-->
    Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
<!--CRLF-->
    
<!--CRLF-->
    SolrInputDocument doc = new SolrInputDocument();
<!--CRLF-->
    doc.addField("id", 2);
<!--CRLF-->
    doc.addField("name", "Solr Input Documents 1");
<!--CRLF-->
    doc.addField("manu", "this is SolrInputDocuments 1 content");
<!--CRLF-->
    
<!--CRLF-->
    docs.add(doc);
<!--CRLF-->
    
<!--CRLF-->
    doc = new SolrInputDocument();
<!--CRLF-->
    doc.addField("id", 3);
<!--CRLF-->
    doc.addField("name", "Solr Input Documents 2");
<!--CRLF-->
    doc.addField("manu", "this is SolrInputDocuments 3 content");
<!--CRLF-->
    
<!--CRLF-->
    docs.add(doc);
<!--CRLF-->
    
<!--CRLF-->
    try {
<!--CRLF-->
        //add docs
<!--CRLF-->
        UpdateResponse response = server.add(docs);
<!--CRLF-->
        //commit后才保存到索引库
<!--CRLF-->
        fail(server.commit());
<!--CRLF-->
        fail(response);
<!--CRLF-->
    } catch (SolrServerException e) {
<!--CRLF-->
        e.printStackTrace();
<!--CRLF-->
    } catch (IOException e) {
<!--CRLF-->
        e.printStackTrace();
<!--CRLF-->
    }
<!--CRLF-->
    query("solr");
<!--CRLF-->
}
<!--CRLF-->

就是添加一个List集合

 

6、 添加JavaEntity Bean,这个需要先创建一个JavaBean,然后来完成添加操作;

JavaBean:Index的代码

package com.hoo.entity;
<!--CRLF-->
 
<!--CRLF-->
import org.apache.solr.client.solrj.beans.Field;
<!--CRLF-->
 
<!--CRLF-->
/**
<!--CRLF-->
 * <b>function:</b> JavaEntity Bean;Index需要添加相关的Annotation注解,便于告诉solr哪些属性参与到index中
<!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF-->
 */
<!--CRLF-->
public class Index {
<!--CRLF-->
    //@Field setter方法上添加Annotation也是可以的
<!--CRLF-->
    private String id;
<!--CRLF-->
    @Field
<!--CRLF-->
    private String name;
<!--CRLF-->
    @Field
<!--CRLF-->
    private String manu;
<!--CRLF-->
    @Field
<!--CRLF-->
    private String[] cat;
<!--CRLF-->
 
<!--CRLF-->
    @Field
<!--CRLF-->
    private String[] features;
<!--CRLF-->
    @Field
<!--CRLF-->
    private float price;
<!--CRLF-->
    @Field
<!--CRLF-->
    private int popularity;
<!--CRLF-->
    @Field
<!--CRLF-->
    private boolean inStock;
<!--CRLF-->
    
<!--CRLF-->
    public String getId() {
<!--CRLF-->
        return id;
<!--CRLF-->
    }
<!--CRLF-->
    
<!--CRLF-->
    @Field
<!--CRLF-->
    public void setId(String id) {
<!--CRLF-->
        this.id = id;
<!--CRLF-->
    }
<!--CRLF-->
    //getter、setter方法
<!--CRLF-->
 
<!--CRLF-->
    public String toString() {
<!--CRLF-->
        return this.id + "#" + this.name + "#" + this.manu + "#" + this.cat;
<!--CRLF-->
    }
<!--CRLF-->
}
<!--CRLF-->

注意上面的属性是和在apache-solr-4.0\example\solr\conf目录下的schema.xml中可以找到有关于field属性的配置对应的。如果你Index JavaBean中出现的属性在schema.xml的field配置无法找到,那么出出现unknown filed错误。

添加Bean完成doc添加操作

/**
<!--CRLF-->
 * <b>function:</b> 添加JavaEntity Bean
<!--CRLF--><!--CRLF--><!--CRLF-->
 */
<!--CRLF-->
@Test
<!--CRLF-->
public void addBean() {
<!--CRLF-->
    //Index需要添加相关的Annotation注解,便于告诉solr哪些属性参与到index中
<!--CRLF-->
    Index index = new Index();
<!--CRLF-->
    index.setId("4");
<!--CRLF-->
    index.setName("add bean index");
<!--CRLF-->
    index.setManu("index bean manu");
<!--CRLF-->
    index.setCat(new String[] { "a1", "b2" });
<!--CRLF-->
    
<!--CRLF-->
    try {
<!--CRLF-->
        //添加Index Bean到索引库
<!--CRLF-->
        UpdateResponse response = server.addBean(index);
<!--CRLF-->
        fail(server.commit());//commit后才保存到索引库
<!--CRLF-->
        fail(response);
<!--CRLF-->
    } catch (SolrServerException e) {
<!--CRLF-->
        e.printStackTrace();
<!--CRLF-->
    } catch (IOException e) {
<!--CRLF-->
        e.printStackTrace();
<!--CRLF-->
    }
<!--CRLF-->
    queryAll();
<!--CRLF-->
}
<!--CRLF-->

 

7、 添加Bean集合

/**
<!--CRLF-->
 * <b>function:</b> 添加Entity Bean集合到索引库
<!--CRLF--><!--CRLF--><!--CRLF-->
 */
<!--CRLF-->
@Test
<!--CRLF-->
public void addBeans() {
<!--CRLF-->
    Index index = new Index();
<!--CRLF-->
    index.setId("6");
<!--CRLF-->
    index.setName("add beans index 1");
<!--CRLF-->
    index.setManu("index beans manu 1");
<!--CRLF-->
    index.setCat(new String[] { "a", "b" });
<!--CRLF-->
    
<!--CRLF-->
    List<Index> indexs = new ArrayList<Index>();
<!--CRLF-->
    indexs.add(index);
<!--CRLF-->
    
<!--CRLF-->
    index = new Index();
<!--CRLF-->
    index.setId("5");
<!--CRLF-->
    index.setName("add beans index 2");
<!--CRLF-->
    index.setManu("index beans manu 2");
<!--CRLF-->
    index.setCat(new String[] { "aaa", "bbbb" });
<!--CRLF-->
    indexs.add(index);
<!--CRLF-->
    try {
<!--CRLF-->
        //添加索引库
<!--CRLF-->
        UpdateResponse response = server.addBeans(indexs);
<!--CRLF-->
        fail(server.commit());//commit后才保存到索引库
<!--CRLF-->
        fail(response);
<!--CRLF-->
    } catch (SolrServerException e) {
<!--CRLF-->
        e.printStackTrace();
<!--CRLF-->
    } catch (IOException e) {
<!--CRLF-->
        e.printStackTrace();
<!--CRLF-->
    }
<!--CRLF-->
    queryAll();
<!--CRLF-->
}
<!--CRLF-->

 

8、 删除索引Document

/**
<!--CRLF-->
 * <b>function:</b> 删除索引操作
<!--CRLF--><!--CRLF--><!--CRLF-->
 */
<!--CRLF-->
@Test
<!--CRLF-->
public void remove() {
<!--CRLF-->
    try {
<!--CRLF-->
        //删除id为1的索引
<!--CRLF-->
        server.deleteById("1");
<!--CRLF-->
        server.commit();
<!--CRLF-->
        query("id:1");
<!--CRLF-->
        
<!--CRLF-->
        //根据id集合,删除多个索引
<!--CRLF-->
        List<String> ids = new ArrayList<String>();
<!--CRLF-->
        ids.add("2");
<!--CRLF-->
        ids.add("3");
<!--CRLF-->
        server.deleteById(ids);
<!--CRLF-->
        server.commit(true, true);
<!--CRLF-->
        query("id:3 id:2");
<!--CRLF-->
        
<!--CRLF-->
        //删除查询到的索引信息
<!--CRLF-->
        server.deleteByQuery("id:4 id:6");
<!--CRLF-->
        server.commit(true, true);
<!--CRLF-->
        queryAll();
<!--CRLF-->
        
<!--CRLF-->
    } catch (SolrServerException e) {
<!--CRLF-->
        e.printStackTrace();
<!--CRLF-->
    } catch (IOException e) {
<!--CRLF-->
        e.printStackTrace();
<!--CRLF-->
    }
<!--CRLF-->
}
<!--CRLF-->

 

9、 查询索引

/**
<!--CRLF-->
 * <b>function:</b> 查询所有索引信息
<!--CRLF--><!--CRLF--><!--CRLF-->
 */
<!--CRLF-->
@Test
<!--CRLF-->
public void queryAll() {
<!--CRLF-->
    ModifiableSolrParams params = new ModifiableSolrParams();
<!--CRLF-->
    // 查询关键词,*:*代表所有属性、所有值,即所有index
<!--CRLF-->
    params.set("q", "*:*");
<!--CRLF-->
    // 分页,start=0就是从0开始,,rows=5当前返回5条记录,第二页就是变化start这个值为5就可以了。
<!--CRLF-->
    params.set("start", 0);
<!--CRLF-->
    params.set("rows", Integer.MAX_VALUE);
<!--CRLF-->
    
<!--CRLF-->
    // 排序,,如果按照id 排序,,那么将score desc 改成 id desc(or asc)
<!--CRLF-->
    params.set("sort", "score desc");
<!--CRLF-->
 
<!--CRLF-->
    // 返回信息 * 为全部 这里是全部加上score,如果不加下面就不能使用score
<!--CRLF-->
    params.set("fl", "*,score");
<!--CRLF-->
    
<!--CRLF-->
    try {
<!--CRLF-->
        QueryResponse response = server.query(params);
<!--CRLF-->
        
<!--CRLF-->
        SolrDocumentList list = response.getResults();
<!--CRLF-->
        for (int i = 0; i < list.size(); i++) {
<!--CRLF-->
            fail(list.get(i));
<!--CRLF-->
        }
<!--CRLF-->
    } catch (SolrServerException e) {
<!--CRLF-->
        e.printStackTrace();
<!--CRLF-->
    }
<!--CRLF-->
}
<!--CRLF-->

 

10、 其他和Server有关方法

/**
<!--CRLF-->
 * <b>function:</b> 其他server相关方法测试
<!--CRLF--><!--CRLF--><!--CRLF-->
 */
<!--CRLF-->
@Test
<!--CRLF-->
public void otherMethod() {
<!--CRLF-->
    fail(server.getBinder());
<!--CRLF-->
    try {
<!--CRLF-->
        fail(server.optimize());//合并索引文件,可以优化索引、提供性能,但需要一定的时间
<!--CRLF-->
        fail(server.ping());//ping服务器是否连接成功
<!--CRLF-->
        
<!--CRLF-->
        Index index = new Index();
<!--CRLF-->
        index.setId("299");
<!--CRLF-->
        index.setName("add bean index199");
<!--CRLF-->
        index.setManu("index bean manu199");
<!--CRLF-->
        index.setCat(new String[] { "a199", "b199" });
<!--CRLF-->
        
<!--CRLF-->
        UpdateResponse response = server.addBean(index);
<!--CRLF-->
        fail("response: " + response);
<!--CRLF-->
        
<!--CRLF-->
        queryAll();
<!--CRLF-->
        //回滚掉之前的操作,rollback addBean operation
<!--CRLF-->
        fail("rollback: " + server.rollback());
<!--CRLF-->
        //提交操作,提交后无法回滚之前操作;发现addBean没有成功添加索引
<!--CRLF-->
        fail("commit: " + server.commit());
<!--CRLF-->
        queryAll();
<!--CRLF-->
    } catch (SolrServerException e) {
<!--CRLF-->
        e.printStackTrace();
<!--CRLF-->
    } catch (IOException e) {
<!--CRLF-->
        e.printStackTrace();
<!--CRLF-->
    }
<!--CRLF-->
}
<!--CRLF-->

 

11、 文档查询

/**
<!--CRLF-->
 * <b>function:</b> query 基本用法测试
<!--CRLF--><!--CRLF--><!--CRLF-->
 */
<!--CRLF-->
@Test
<!--CRLF-->
public void queryCase() {
<!--CRLF-->
    //AND 并且
<!--CRLF-->
    SolrQuery params = new SolrQuery("name:apple AND manu:inc");
<!--CRLF-->
    
<!--CRLF-->
    //OR 或者
<!--CRLF-->
    params.setQuery("name:apple OR manu:apache");
<!--CRLF-->
    //空格 等同于 OR
<!--CRLF-->
    params.setQuery("name:server manu:dell");
<!--CRLF-->
    
<!--CRLF-->
    //params.setQuery("name:solr - manu:inc");
<!--CRLF-->
    //params.setQuery("name:server + manu:dell");
<!--CRLF-->
    
<!--CRLF-->
    //查询name包含solr apple
<!--CRLF-->
    params.setQuery("name:solr,apple");
<!--CRLF-->
    //manu不包含inc
<!--CRLF-->
    params.setQuery("name:solr,apple NOT manu:inc");
<!--CRLF-->
    
<!--CRLF-->
    //50 <= price <= 200
<!--CRLF-->
    params.setQuery("price:[50 TO 200]");
<!--CRLF-->
    params.setQuery("popularity:[5 TO 6]");
<!--CRLF-->
    //params.setQuery("price:[50 TO 200] - popularity:[5 TO 6]");
<!--CRLF-->
    //params.setQuery("price:[50 TO 200] + popularity:[5 TO 6]");
<!--CRLF-->
    
<!--CRLF-->
    //50 <= price <= 200 AND 5 <= popularity <= 6
<!--CRLF-->
    params.setQuery("price:[50 TO 200] AND popularity:[5 TO 6]");
<!--CRLF-->
    params.setQuery("price:[50 TO 200] OR popularity:[5 TO 6]");
<!--CRLF-->
    
<!--CRLF-->
    //过滤器查询,可以提高性能 filter 类似多个条件组合,如and
<!--CRLF-->
    //params.addFilterQuery("id:VA902B");
<!--CRLF-->
    //params.addFilterQuery("price:[50 TO 200]");
<!--CRLF-->
    //params.addFilterQuery("popularity:[* TO 5]");
<!--CRLF-->
    //params.addFilterQuery("weight:*");
<!--CRLF-->
    //0 < popularity < 6  没有等于
<!--CRLF-->
    //params.addFilterQuery("popularity:{0 TO 6}");
<!--CRLF-->
    
<!--CRLF-->
    //排序
<!--CRLF-->
    params.addSortField("id", ORDER.asc);
<!--CRLF-->
    
<!--CRLF-->
    //分页:start开始页,rows每页显示记录条数
<!--CRLF-->
    //params.add("start", "0");
<!--CRLF-->
    //params.add("rows", "200");
<!--CRLF-->
    //params.setStart(0);
<!--CRLF-->
    //params.setRows(200);
<!--CRLF-->
    
<!--CRLF-->
    //设置高亮
<!--CRLF-->
    params.setHighlight(true); // 开启高亮组件
<!--CRLF-->
    params.addHighlightField("name");// 高亮字段
<!--CRLF-->
    params.setHighlightSimplePre("<font color='red'>");//标记,高亮关键字前缀
<!--CRLF-->
    params.setHighlightSimplePost("</font>");//后缀
<!--CRLF-->
    params.setHighlightSnippets(1);//结果分片数,默认为1
<!--CRLF-->
    params.setHighlightFragsize(1000);//每个分片的最大长度,默认为100
<!--CRLF-->
 
<!--CRLF-->
    //分片信息
<!--CRLF-->
    params.setFacet(true)
<!--CRLF-->
        .setFacetMinCount(1)
<!--CRLF-->
        .setFacetLimit(5)//段
<!--CRLF-->
        .addFacetField("name")//分片字段
<!--CRLF-->
        .addFacetField("inStock"); 
<!--CRLF-->
    
<!--CRLF-->
    //params.setQueryType("");
<!--CRLF-->
    
<!--CRLF-->
    try {
<!--CRLF-->
        QueryResponse response = server.query(params);
<!--CRLF-->
        
<!--CRLF-->
        /*List<Index> indexs = response.getBeans(Index.class);
<!--CRLF-->
        for (int i = 0; i < indexs.size(); i++) {
<!--CRLF-->
            fail(indexs.get(i));
<!--CRLF-->
        }*/
<!--CRLF-->
        
<!--CRLF-->
        //输出查询结果集
<!--CRLF-->
        SolrDocumentList list = response.getResults();
<!--CRLF-->
        fail("query result nums: " + list.getNumFound());
<!--CRLF-->
        for (int i = 0; i < list.size(); i++) {
<!--CRLF-->
            fail(list.get(i));
<!--CRLF-->
        }
<!--CRLF-->
        
<!--CRLF-->
        //输出分片信息
<!--CRLF-->
        List<FacetField> facets = response.getFacetFields();
<!--CRLF-->
        for (FacetField facet : facets) {
<!--CRLF-->
            fail(facet);
<!--CRLF-->
            List<Count> facetCounts = facet.getValues();
<!--CRLF-->
            for (FacetField.Count count : facetCounts) {
<!--CRLF-->
                System.out.println(count.getName() + ": " + count.getCount());
<!--CRLF-->
            }
<!--CRLF-->
        }
<!--CRLF-->
    } catch (SolrServerException e) {
<!--CRLF-->
        e.printStackTrace();
<!--CRLF-->
    } 
<!--CRLF-->
}
<!--CRLF-->

 

12、 分片查询、统计

/**
<!--CRLF-->
 * <b>function:</b> 分片查询, 可以统计关键字及出现的次数、或是做自动补全提示
<!--CRLF--><!--CRLF--><!--CRLF-->
 */
<!--CRLF-->
@Test
<!--CRLF-->
public void facetQueryCase() {
<!--CRLF-->
    SolrQuery params = new SolrQuery("*:*");
<!--CRLF-->
    
<!--CRLF-->
    //排序
<!--CRLF-->
    params.addSortField("id", ORDER.asc);
<!--CRLF-->
    
<!--CRLF-->
    params.setStart(0);
<!--CRLF-->
    params.setRows(200);
<!--CRLF-->
 
<!--CRLF-->
    //Facet为solr中的层次分类查询
<!--CRLF-->
    //分片信息
<!--CRLF-->
    params.setFacet(true)
<!--CRLF-->
        .setQuery("*:*")
<!--CRLF-->
        .setFacetMinCount(1)
<!--CRLF-->
        .setFacetLimit(5)//段
<!--CRLF-->
        //.setFacetPrefix("electronics", "cat")
<!--CRLF-->
        .setFacetPrefix("cor")//查询manu、name中关键字前缀是cor的
<!--CRLF-->
        .addFacetField("manu")
<!--CRLF-->
        .addFacetField("name");//分片字段
<!--CRLF-->
 
<!--CRLF-->
    try {
<!--CRLF-->
        QueryResponse response = server.query(params);
<!--CRLF-->
        
<!--CRLF-->
        //输出查询结果集
<!--CRLF-->
        SolrDocumentList list = response.getResults();
<!--CRLF-->
        fail("Query result nums: " + list.getNumFound());
<!--CRLF-->
        
<!--CRLF-->
        for (int i = 0; i < list.size(); i++) {
<!--CRLF-->
            fail(list.get(i));
<!--CRLF-->
        }
<!--CRLF-->
        
<!--CRLF-->
        fail("All facet filed result: ");
<!--CRLF-->
        //输出分片信息
<!--CRLF-->
        List<FacetField> facets = response.getFacetFields();
<!--CRLF-->
        for (FacetField facet : facets) {
<!--CRLF-->
            fail(facet);
<!--CRLF-->
            List<Count> facetCounts = facet.getValues();
<!--CRLF-->
            for (FacetField.Count count : facetCounts) {
<!--CRLF-->
                //关键字 - 出现次数
<!--CRLF-->
                fail(count.getName() + ": " + count.getCount());
<!--CRLF-->
            }
<!--CRLF-->
        }
<!--CRLF-->
        
<!--CRLF-->
        fail("Search facet [name] filed result: ");
<!--CRLF-->
        //输出分片信息
<!--CRLF-->
        FacetField facetField = response.getFacetField("name");
<!--CRLF-->
        List<Count> facetFields = facetField.getValues();
<!--CRLF-->
        for (Count count : facetFields) {
<!--CRLF-->
            //关键字 - 出现次数
<!--CRLF-->
            fail(count.getName() + ": " + count.getCount());
<!--CRLF-->
        }
<!--CRLF-->
    } catch (SolrServerException e) {
<!--CRLF-->
        e.printStackTrace();
<!--CRLF-->
    } 
<!--CRLF-->
}
<!--CRLF-->

分片查询在某些统计关键字的时候还是很有用的,可以统计关键字出现的次数,可以通过统计的关键字来搜索相关文档的信息。

 

Document文档和JavaBean相互转换

这里转换的Bean是一个简单的User对象

package com.admomo.entity;
<!--CRLF-->
 
<!--CRLF-->
import java.io.Serializable;
<!--CRLF-->
import org.apache.solr.client.solrj.beans.Field;
<!--CRLF-->
 
<!--CRLF-->
/**
<!--CRLF-->
 * <b>function:</b> User Entity Bean;所有被添加Annotation @Field 注解的属性将参与index操作
<!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF-->
 */
<!--CRLF-->
public class User implements Serializable {
<!--CRLF-->
 
<!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF-->
    private static final long serialVersionUID = 8606788203814942679L;
<!--CRLF-->
 
<!--CRLF-->
    //@Field
<!--CRLF-->
    private int id;
<!--CRLF-->
    @Field
<!--CRLF-->
    private String name;
<!--CRLF-->
    @Field
<!--CRLF-->
    private int age;
<!--CRLF-->
    
<!--CRLF-->
    /**
<!--CRLF-->
     * 可以给某个属性重命名,likes就是solr index的属性;在solrIndex中将显示like为likes
<!--CRLF-->
     */
<!--CRLF-->
    @Field("likes")
<!--CRLF-->
    private String[] like;
<!--CRLF-->
    @Field
<!--CRLF-->
    private String address;
<!--CRLF-->
    @Field
<!--CRLF-->
    private String sex;
<!--CRLF-->
    @Field
<!--CRLF-->
    private String remark;
<!--CRLF-->
    public int getId() {
<!--CRLF-->
        return id;
<!--CRLF-->
    }
<!--CRLF-->
    
<!--CRLF-->
    //setter 方法上面也可以
<!--CRLF-->
    @Field
<!--CRLF-->
    public void setId(int id) {
<!--CRLF-->
        this.id = id;
<!--CRLF-->
    }
<!--CRLF-->
    public String getName() {
<!--CRLF-->
        return name;
<!--CRLF-->
    }
<!--CRLF-->
    //getter、setter
<!--CRLF-->
    
<!--CRLF-->
    @Override
<!--CRLF-->
    public String toString() {
<!--CRLF-->
        return this.id + "#" + this.name + "#" + this.age + "#" + this.like + "#" + this.address + "#" + this.sex + "#" + this.remark;
<!--CRLF-->
    }
<!--CRLF-->
}
<!--CRLF-->

 

测试类代码如下

package com.admomo.test;
<!--CRLF-->
 
<!--CRLF-->
import org.apache.solr.client.solrj.beans.DocumentObjectBinder;
<!--CRLF-->
import org.apache.solr.common.SolrDocument;
<!--CRLF-->
import org.apache.solr.common.SolrDocumentList;
<!--CRLF-->
import org.apache.solr.common.SolrInputDocument;
<!--CRLF-->
import org.apache.solr.common.SolrInputField;
<!--CRLF-->
import org.junit.Test;
<!--CRLF-->
import com.admomo.entity.User;
<!--CRLF-->
 
<!--CRLF-->
/**
<!--CRLF-->
 * <b>function:</b>SolrInputDocument implements Map, Iterable
<!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF--><!--CRLF-->
 */
<!--CRLF-->
public class SolrInputDocumentTest {
<!--CRLF-->
 
<!--CRLF-->
    public final void fail(Object o) {
<!--CRLF-->
        System.out.println(o);
<!--CRLF-->
    }
<!--CRLF-->
    
<!--CRLF-->
    /**
<!--CRLF-->
     * <b>function:</b> 创建SolrInputDocument
<!--CRLF--><!--CRLF--><!--CRLF-->
     */
<!--CRLF-->
    @Test
<!--CRLF-->
    public void createDoc() {
<!--CRLF-->
        SolrInputDocument doc = new SolrInputDocument();
<!--CRLF-->
        doc.addField("id", System.currentTimeMillis());
<!--CRLF-->
        doc.addField("name", "SolrInputDocument");
<!--CRLF-->
        doc.addField("age", 22, 2.0f);
<!--CRLF-->
        
<!--CRLF-->
        doc.addField("like", new String[] { "music", "book", "sport" });
<!--CRLF-->
        
<!--CRLF-->
        doc.put("address", new SolrInputField("guangzhou"));
<!--CRLF-->
        
<!--CRLF-->
        doc.setField("sex", "man");
<!--CRLF-->
        doc.setField("remark", "china people", 2.0f);
<!--CRLF-->
        
<!--CRLF-->
        fail(doc);
<!--CRLF-->
    }
<!--CRLF-->
    
<!--CRLF-->
    /**
<!--CRLF-->
     * <b>function:</b> 利用DocumentObjectBinder对象将SolrInputDocument 和 User对象相互转换
<!--CRLF--><!--CRLF--><!--CRLF-->
     */
<!--CRLF-->
    @Test
<!--CRLF-->
    public void docAndBean4Binder() {
<!--CRLF-->
        SolrDocument doc = new SolrDocument();
<!--CRLF-->
        doc.addField("id", 456);
<!--CRLF-->
        doc.addField("name", "SolrInputDocument");
<!--CRLF-->
        
<!--CRLF-->
        doc.addField("likes", new String[] { "music", "book", "sport" });
<!--CRLF-->
        
<!--CRLF-->
        doc.put("address", "guangzhou");
<!--CRLF-->
        
<!--CRLF-->
        doc.setField("sex", "man");
<!--CRLF-->
        doc.setField("remark", "china people");
<!--CRLF-->
        
<!--CRLF-->
        DocumentObjectBinder binder = new DocumentObjectBinder();
<!--CRLF-->
        
<!--CRLF-->
        User user = new User();
<!--CRLF-->
        user.setId(222);
<!--CRLF-->
        user.setName("JavaBean");
<!--CRLF-->
        user.setLike(new String[] { "music", "book", "sport" });
<!--CRLF-->
        user.setAddress("guangdong");
<!--CRLF-->
        
<!--CRLF-->
        fail(doc);
<!--CRLF-->
        // User ->> SolrInputDocument
<!--CRLF-->
        fail(binder.toSolrInputDocument(user));
<!--CRLF-->
        // SolrDocument ->> User
<!--CRLF-->
        fail(binder.getBean(User.class, doc));
<!--CRLF-->
        
<!--CRLF-->
        SolrDocumentList list = new SolrDocumentList();
<!--CRLF-->
        list.add(doc);
<!--CRLF-->
        list.add(doc);
<!--CRLF-->
        //SolrDocumentList ->> List
<!--CRLF-->
        fail(binder.getBeans(User.class, list));
<!--CRLF-->
    }
<!--CRLF-->
    
<!--CRLF-->
    /**
<!--CRLF-->
     * <b>function:</b> SolrInputDocument的相关方法
<!--CRLF--><!--CRLF--><!--CRLF-->
     */
<!--CRLF-->
    @Test
<!--CRLF-->
    public void docMethod() {
<!--CRLF-->
        SolrInputDocument doc = new SolrInputDocument();
<!--CRLF-->
        doc.addField("id", System.currentTimeMillis());
<!--CRLF-->
        doc.addField("name", "SolrInputDocument");
<!--CRLF-->
        doc.addField("age", 23, 1.0f);
<!--CRLF-->
        doc.addField("age", 22, 2.0f);
<!--CRLF-->
        doc.addField("age", 24, 0f);
<!--CRLF-->
        
<!--CRLF-->
        fail(doc.entrySet());
<!--CRLF-->
        fail(doc.get("age"));
<!--CRLF-->
        //排名有用,类似百度竞价排名
<!--CRLF-->
        doc.setDocumentBoost(2.0f);
<!--CRLF-->
        fail(doc.getDocumentBoost());
<!--CRLF-->
        fail(doc.getField("name"));
<!--CRLF-->
        fail(doc.getFieldNames());//keys
<!--CRLF-->
        fail(doc.getFieldValues("age"));
<!--CRLF-->
        fail(doc.getFieldValues("id"));
<!--CRLF-->
        fail(doc.values());
<!--CRLF-->
    }
<!--CRLF-->
}
<!--CRLF-->
分享到:
评论

相关推荐

    solrj的使用

    添加对应的依赖项后,便可以开始创建Solr服务器实例,并连接到运行的Solr实例。例如: ```java import org.apache.solr.client.solrj.SolrClient; import org.apache.solr.client.solrj.impl.HttpSolrClient; ...

    solr-solrj 5.0.0 demo

    接着,创建`SolrServer`实例,连接到本地或远程的Solr服务。可以使用`HttpSolrServer`类来实现这一目标,传入Solr服务器的URL。 在中文分词方面,Solr-Solrj配合Solr的中文分析器(如IK Analyzer、Smart Chinese ...

    SolrJ需要的jar包

    SolrJ提供了一系列API,用于创建Solr服务器实例、构建查询请求、解析响应以及添加、删除和更新Solr索引中的文档。这些API极大地简化了与Solr交互的过程,避免了直接处理HTTP请求和JSON响应的复杂性。 要使用SolrJ,...

    SolrJ6.3.0

    开发者可以使用这个库来创建 Solr 客户端实例,发送请求并接收响应,进行索引管理和查询操作。 3. **solr-langid-6.3.0.jar**:这个库包含了语言识别功能,可以帮助 Solr 自动识别文档中的语言,以便进行适当的分词...

    solr配置和solrJ的使用

    ### Solr配置与SolrJ使用详解 #### 一、Solr基本安装与配置 **1. 下载Solr** - **步骤说明**: 从Apache官方镜像站点下载Solr 1.4.1版本。 - **操作详情**: 访问链接`http://apache.etoak.com/lucene/solr/`,...

    solrj使用教程

    例如,创建一个连接本地Solr服务器的实例: ```java SolrClient client = new HttpSolrClient.Builder("http://localhost:8983/solr").build(); ``` **3. 增加文档** 使用`add()`方法向Solr索引中添加文档。首先,...

    Solrj 中文教程

    ### Solrj 中文教程知识点概览 #### 一、企业搜索引擎方案选型与Solr简介 ##### 1.1 企业搜索引擎方案选型 在选择企业级搜索引擎时,主要考虑的是灵活性、可扩展性和成本效益。对于门户社区等场景来说,搜索引擎的...

    Sample-SolrJ-Client:示例 SolrJ 客户端

    - 使用连接池管理 `SolrServer` 实例,以提高性能并减少资源消耗。 - 优化网络通信,例如使用 HTTPS 安全连接,或者配置 SolrJ 使用 HTTP 缓存。 - 适当地处理并发和事务,确保数据的一致性和完整性。 总之,...

    Solrj and Solr and LDAP and SearchEngine

    它提供了丰富的API,使得开发人员可以方便地执行索引、查询、配置和管理Solr实例。Solrj简化了Solr的集成工作,例如在Java应用中添加或更新文档,以及执行复杂的搜索查询。 【Solr】 Solr是基于Lucene的全文搜索...

    商城项目的搜索功能示例代码-使用solrj.zip

    在本压缩包“商城项目的搜索功能示例代码-使用solrj.zip”中,主要包含的是一个使用SolrJ库实现在商城项目中实现搜索功能的代码实例。SolrJ是Apache Solr官方提供的Java客户端库,它允许开发人员方便地与Solr服务器...

    solr-config_solrj-demo.rar_DEMO_solr_solr的j

    总之,"solr-config_solrj-demo.rar_DEMO_solr_solr的j"这个DEMO是一个全面了解和实践Solr配置及SolrJ使用的宝贵资源,它将引导你逐步掌握如何在实际项目中有效地运用Solr进行全文检索和数据分析。通过深入学习和...

    人工智能-项目实践-搜索引擎-基于solrj开发solr主从搜索引擎服务的dubbo组件

    《基于Solrj开发Solr主从搜索引擎服务的Dubbo组件》 在现代信息技术领域,搜索引擎作为信息检索的重要工具,其高效、精准的搜索能力对于企业和用户来说具有极高的价值。本项目实践聚焦于利用Solrj开发一个支持主从...

    java1.6源码-solrj.client:使用solr.solrjJava库将Java索引到Solr6.2.1的源代码

    首先,SolrJ的核心在于创建一个`SolrClient`实例,它是与Solr服务器通信的接口。在Java 1.6中,我们通常使用`HttpSolrClient`,因为它基于HTTP协议,易于实现且跨平台。例如: ```java SolrClient client = new ...

    Solr 4.0 源代码实例

    1. **索引创建与更新**:演示如何使用SolrJ或其他API添加、删除和更新文档。 2. **查询与结果处理**:展示如何构造查询语句,使用高亮、 faceting、自定义排序和分页等功能。 3. **搜索性能优化**:可能包含关于索引...

    JAVA+Solr分词项目工程实例源代码学习

    本项目实例旨在帮助学习者掌握如何结合Java与Solr进行分词项目的实施。以下是关于这个主题的详细知识讲解: 1. **Java**: Java是一种广泛使用的面向对象的编程语言,以其“一次编写,到处运行”的特性闻名。在信息...

Global site tag (gtag.js) - Google Analytics