Solr学习之三:Solr各种查询实例

来源:互联网 发布:淘宝外贸男鞋店 编辑:程序博客网 时间:2024/05/17 06:21

文档里的查询实例可以应对一些普通的solr查询,复杂的solr查询还得自己再继续添加代码,自己也在学习中。先贴出完整代码,后再做说明。

注意:在运行如下查询实例前你得先向solr Admin中添加了你要查询的内容并且你所查询的字段(如idnamecontent等)在schema.xml中已被定义。

l  代码如下:

package mysolrtest;

 

import org.apache.solr.client.solrj.SolrQuery;

import org.apache.solr.client.solrj.SolrServer;

import org.apache.solr.client.solrj.SolrServerException;

import org.apache.solr.client.solrj.impl.HttpSolrServer;

import org.apache.solr.client.solrj.response.QueryResponse;

import org.apache.solr.common.SolrDocument;

import org.apache.solr.common.SolrDocumentList;

 

public classQueryTest {

static Stringurl = "http://10.7.11.141:8080/solr";

    static SolrServersolr = new HttpSolrServer(url);

   

    public static void main(String[]arguments)throws SolrServerException{

        QueryTesttest = newQueryTest();

        test.solrOrder();

        test.likeQuery();

        test.pageQuery();

        test.multipleQueryAND();

        test.multipleQueryOR();

        test.multipleQueryNOT();

    }

   

    //排序查询

    public void solrOrder() throwsSolrServerException{

        SolrQueryquery = newSolrQuery();         

        query.setQuery("*:*");//查询所有索引

        query.addSortField("id",SolrQuery.ORDER.asc);//id升序排列

        QueryResponsersp = solr.query(query);

        SolrDocumentListlist = rsp.getResults();

       

        for (int i = 0; i <list.size(); i++){

            //显示查询到的所有字段及字段内容

            System.out.println(list.get(i));

           

            //显示查询到的特定字段内容,下面几个函数也可这样显示

            SolrDocumentdoc = list.get(i);

             System.out.println(doc.get("id") +" " + doc.get("name") +

                " " + doc.get("interest")+" "+ doc.get("dream"));

        }

       

    }

   

    //模糊查询

    public void likeQuery() throwsSolrServerException{

        SolrQueryquery = newSolrQuery();         

        query.setQuery("name:*xiaomutou*");//查询name中含有xiaomutou字样的索引

        QueryResponsersp = solr.query(query);

        SolrDocumentListlist = rsp.getResults();

        for (int i = 0; i <list.size(); i++){

            System.out.println(list.get(i));

        }

    }

   

    //分页查询

    public void pageQuery() throwsSolrServerException{

        SolrQueryquery = new SolrQuery();         

        query.setQuery("*:*");

        query.setStart(5);//当设置为5时,表示从第6记录取,默认取值为0,就是从第1条开始取

        query.setRows(5);//表示取出的记录数,默认是10

        QueryResponsersp = solr.query(query);

        SolrDocumentListlist = rsp.getResults();

        for (int i = 0; i <list.size(); i++){

            System.out.println(list.get(i));

        }

    }

   

       //多条件AND(并且)的情况

        public void multipleQueryAND() throwsSolrServerException{

       //之前下行语句是在函数外面定义的(上面3个函数也是),如此就会出现覆盖情况

        SolrQuery query = new SolrQuery();

//      query.setQuery("name:*xiaomutou*");

//      query.setFilterQueries("dream:*");//过滤查询,即除上面的条件还需满足有字段dream

        //可以用下行语句代替前面两行语句。(注意:AND必须大写,可以用“&&”代替,如果是小写则

        //结果并非我们所预期的。我的理解是and并不是多条件查询关键字,如是and编译器则理解成

        //and字段,而空格相当于多条件OR,所以就相当于是OR查询了)

        query.setQuery("name:*xiaomutou* ANDdream:*");

 

        //idnamedream字段。也可这样写query.setFields("id", "name","dream")

        query.setFields("id, name, dream");

        QueryResponsersp = solr.query(query);

        SolrDocumentListlist = rsp.getResults();

//      System.out.println(list.size());//输出符合条件的list个数

        for (int i = 0; i < list.size();i++){

            System.out.println(list.get(i));

        }

    }

   

    //多条件OR(或者)的情况

    public void multipleQueryOR() throwsSolrServerException{

        SolrQueryquery = newSolrQuery();

        query.setQuery("name:*datou* OR content:*");//OR必须大写或用空格“||”代替

        query.setFields("id, name, content");

        QueryResponsersp = solr.query(query);

        SolrDocumentListlist = rsp.getResults();

        for (int i = 0; i <list.size(); i++){

            System.out.println(list.get(i));

        }

    }

   

    //多条件NOT(非)的情况

    public void multipleQueryNOT() throwsSolrServerException{

        SolrQueryquery = newSolrQuery();

        //NOT必须大写或用“-”“!”代替,并且“-”或者“!”必须紧跟content,中间不能有空格

query.setQuery("name:*datou* NOTcontent:stick");

        query.setFields("id, name, content");

        QueryResponsersp = solr.query(query);

        SolrDocumentListlist = rsp.getResults();

        for (int i = 0; i <list.size(); i++){

            System.out.println(list.get(i));

        }

    }

}

l  说明如下:

1.     排序查询

使用addSortField方法可将查询出来的结果按照你指定的字段进行排序。单独运行排序查询结果如下:

(小技巧:可以选中你想注释的代码行按ctrl+7注释掉,取消注释也是如此)

SolrDocument{id=1, name=xiaomutou,sex=female, interest=[Reading travelling watching and singing!],_version_=1462269635528228864}

1 xiaomutou [Reading travellingwatching and singing!] null

SolrDocument{id=2, name=datou,sex=male, interest=[Travelling singsing and learning!], _version_=1462269635557588992}

2 datou [Travelling singsing andlearning!] null

SolrDocument{id=3, name=gufeng,age=22, dream=[Having a beautiful life!], _version_=1462269635558637568}

3 gufeng null [Having a beautifullife!]

SolrDocument{id=4, name=shanyin,age=23, dream=[Giving pengpeng a beautiful life!],_version_=1462269635559686144}

4 shanyin null [Giving pengpeng abeautiful life!]

SolrDocument{id=5, name=jiankang,content=[I just need health!], _version_=1462269635560734720}

5 jiankang null null

SolrDocument{id=6, name=pingan,age=24, content=[I just need safety!], _version_=1462269635560734721}

6 pingan null null

SolrDocument{id=7,name=datouxiaomutou, sex=male, age=23, interest=[Travelling singsing readingwatching and learning!], dream=[Having a beautiful life, travelling around theworld and giving pengpeng a beautiful life!], content=[I will stick to my dreamand strive it throught my life!], _version_=1462269635561783296}

7 datouxiaomutou [Travelling singsing readingwatching and learning!] [Having a beautiful life, travelling around the worldand giving pengpeng a beautiful life!]

2.     模糊查询

模糊查询其实很简单,因为solr本身就支持正则查询,所以通过setQuery指定你要查询的字段,以及要做模糊查询的值就搞定了。单独运行模糊查询结果如下:

SolrDocument{id=1, name=xiaomutou,sex=female, interest=[Reading travelling watching and singing!],_version_=1462269635528228864}

SolrDocument{id=7,name=datouxiaomutou,sex=male,age=23,interest=[Travellingsingsing reading watching and learning!], dream=[Having a beautiful life,travelling around the world and giving pengpeng a beautiful life!], content=[Iwill stick to my dream and strive it throught my life!],_version_=1462269635561783296}

3.分页查询

这里用到了setStart以及setRows方法进行分页,其用法见代码注释。单独运行分页查询结果如下:(说明:因为setStart5)参数设为5,所以结果从第6条记录开始输出)

SolrDocument{id=6, name=pingan,age=24, content=[I just need safety!], _version_=1462269635560734721}

SolrDocument{id=7,name=datouxiaomutou,sex=male,age=23,interest=[Travellingsingsing reading watching and learning!], dream=[Having a beautiful life,travelling around the world and giving pengpeng a beautiful life!], content=[Iwill stick to my dream and strive it throught my life!],_version_=1462269635561783296}

4.多条件查询

多条件查询AND、OR和NOT情况类似,具体用法见代码注释。单独运行多条件查询结果如下:

SolrDocument{id=7,name=datouxiaomutou, dream=[Having a beautiful life, travelling around theworld and giving pengpeng a beautiful life!]}

AND查询结果如上)

SolrDocument{id=7,name=datouxiaomutou, content=[I will stick to my dream and strive it throughtmy life!]}

SolrDocument{id=2, name=datou}

SolrDocument{id=5, name=jiankang,content=[I just need health!]}

SolrDocument{id=6, name=pingan,content=[I just need safety!]}

OR查询结果如上,优先输出同时满足多个条件的,在这里即为id=7索引内容)

SolrDocument{id=2, name=datou}

NOT查询结果如上)

备注:在多条件查询NOT这里,运行结果起初没有达到自己所想要的(自己想只输出id=2索引内容,而之前把id=7索引内容也一起输出了),为了解决这个问题,自己网上找了一下午的资料都没解决,我以为自己没有理解AND、OR和NOT的语法。最后找老师帮忙看是哪里出错了,一起和老师调试程序并网上查资料弄了差不多也有一小时吧,终于找到了问题的根本,原来是content字段没被索引,即在schema.xml中把content字段中的index设置成了false,将其改为true即可(注意:要在tomcat目录下修改schema.xml<记得保存>重启tomcat再重新添加索引内容到solr Admin中才行,在solr下修改schema.xml没有)
0 0
原创粉丝点击