SolrJ的使用

article/2025/10/13 22:54:02

CommonsHttpSolrServer

    CommonsHttpSolrServer 使用HTTPClient 和solr服务器进行通信。

Java代码 复制代码  收藏代码
  1. String url = "http://localhost:8983/solr";   
  2.   SolrServer server = new CommonsHttpSolrServer( url );  
String url = "http://localhost:8983/solr";
SolrServer server = new CommonsHttpSolrServer( url );

 

   CommonsHttpSolrServer 是线程安全的,建议重复使用CommonsHttpSolrServer 实例。

  Setting XMLResponseParser

     sorlr J 目前使用二进制的格式作为默认的格式。对于solr1.2的用户通过显示的设置才能使用XML格式。

   

Java代码 复制代码  收藏代码
  1. server.setParser(new XMLResponseParser());  
server.setParser(new XMLResponseParser());

 

   Changing other Connection Settings

      CommonsHttpSorlrServer 允许设置链接属性。

     

Java代码 复制代码  收藏代码
  1. String url = "http://localhost:8983/solr"  
  2.   CommonsHttpSolrServer server = new CommonsHttpSolrServer( url );   
  3.   server.setSoTimeout(1000);  // socket read timeout   
  4.   server.setConnectionTimeout(100);   
  5.   server.setDefaultMaxConnectionsPerHost(100);   
  6.   server.setMaxTotalConnections(100);   
  7.   server.setFollowRedirects(false);  // defaults to false   
  8.   // allowCompression defaults to false.   
  9.   // Server side must support gzip or deflate for this to have any effect.   
  10.   server.setAllowCompression(true);   
  11.   server.setMaxRetries(1); // defaults to 0.  > 1 not recommended.  
String url = "http://localhost:8983/solr"
CommonsHttpSolrServer server = new CommonsHttpSolrServer( url );
server.setSoTimeout(1000);  // socket read timeout
server.setConnectionTimeout(100);
server.setDefaultMaxConnectionsPerHost(100);
server.setMaxTotalConnections(100);
server.setFollowRedirects(false);  // defaults to false
// allowCompression defaults to false.
// Server side must support gzip or deflate for this to have any effect.
server.setAllowCompression(true);
server.setMaxRetries(1); // defaults to 0.  > 1 not recommended.

 

EmbeddedSolrServer

      EmbeddedSorrServer提供和CommonsHttpSorlrServer相同的接口,它不需要http连接。

     

Java代码 复制代码  收藏代码
  1. //注意,下面的属性也是可以在jvm参数里面设置的   
  2.   System.setProperty("solr.solr.home""/home/shalinsmangar/work/oss/branch-1.3/example/solr");   
  3.   CoreContainer.Initializer initializer = new CoreContainer.Initializer();   
  4.   CoreContainer coreContainer = initializer.initialize();   
  5.   EmbeddedSolrServer server = new EmbeddedSolrServer(coreContainer, "");    
//注意,下面的属性也是可以在jvm参数里面设置的
System.setProperty("solr.solr.home", "/home/shalinsmangar/work/oss/branch-1.3/example/solr");
CoreContainer.Initializer initializer = new CoreContainer.Initializer();
CoreContainer coreContainer = initializer.initialize();
EmbeddedSolrServer server = new EmbeddedSolrServer(coreContainer, "");  

  

   如果你想要使用 Multicore 特性,那么你可以这样使用:

  

Java代码 复制代码  收藏代码
  1. File home = new File( getSolrHome() );   
  2.    File f = new File( home, "solr.xml" );   
  3.    multicore.load( getSolrHome(), f );   
  4.   
  5.    EmbeddedSolrServer server = new EmbeddedSolrServer( multicore, "core name as defined in solr.xml" );  
 File home = new File( getSolrHome() );
File f = new File( home, "solr.xml" );
multicore.load( getSolrHome(), f );
EmbeddedSolrServer server = new EmbeddedSolrServer( multicore, "core name as defined in solr.xml" );

 

    如果你在你的项目中内嵌solr服务,这将是一个不错的选择。无论你能否使用http,它都提供相同的接口。

  用法

    solrj 被设计成一个可扩展的框架,用以向solr服务器提交请求,并接收回应。

    我们已经将最通用的一些命令封装在了solrServer类中了。

 

   Adding Data to Solr

  •     首先需要获得一个server的实例, 
Java代码 复制代码  收藏代码
  1. SolrServer server = getSolrServer();  
 SolrServer server = getSolrServer();
  • 如果,你使用的是一个远程的solrServer的话呢,你或许会这样来实现getSolrServer()这个方法:      
Java代码 复制代码  收藏代码
  1. public SolrServer getSolrServer(){   
  2.     //the instance can be reused   
  3.     return new CommonsHttpSolrServer();   
  4. }  
public SolrServer getSolrServer(){
//the instance can be reused
return new CommonsHttpSolrServer();
}

 

  • 如果,你使用的是一个本地的solrServer的话,你或许会这样来实现getSolrServer()方法:      
Java代码 复制代码  收藏代码
  1. public SolrServer getSolrServer(){   
  2.     //the instance can be reused   
  3.     return new EmbeddedSolrServer();   
  4. }  
public SolrServer getSolrServer(){
//the instance can be reused
return new EmbeddedSolrServer();
}

 

  • 如果,你在添加数据之前,想清空现有的索引,那么你可以这么做:

        

Java代码 复制代码  收藏代码
  1. server.deleteByQuery( "*:*" );// delete everything!  
server.deleteByQuery( "*:*" );// delete everything!

 

  • 构造一个document

         

Java代码 复制代码  收藏代码
  1. SolrInputDocument doc1 = new SolrInputDocument();   
  2.  doc1.addField( "id""id1"1.0f );   
  3.  doc1.addField( "name""doc1"1.0f );   
  4.  doc1.addField( "price"10 );  
   SolrInputDocument doc1 = new SolrInputDocument();
doc1.addField( "id", "id1", 1.0f );
doc1.addField( "name", "doc1", 1.0f );
doc1.addField( "price", 10 );

 

  • 构造另外一个文档,每个文档都能够被独自地提交给solr,但是,批量提交是更高效的。每一个对SolrServer的请求都是http请求,当然对于EmbeddedSolrServer来说,是不一样的。     
Java代码 复制代码  收藏代码
  1. SolrInputDocument doc2 = new SolrInputDocument();   
  2. doc2.addField( "id""id2"1.0f );   
  3. doc2.addField( "name""doc2"1.0f );   
  4. doc2.addField( "price"20 );  
    SolrInputDocument doc2 = new SolrInputDocument();
doc2.addField( "id", "id2", 1.0f );
doc2.addField( "name", "doc2", 1.0f );
doc2.addField( "price", 20 );

 

  • 构造一个文档的集合

        

Java代码 复制代码  收藏代码
  1. Collection<SolrInputDocument> docs = new  ArrayList<SolrInputDocument>();   
  2.  docs.add( doc1 );   
  3.  docs.add( doc2 );  
   Collection<SolrInputDocument> docs = new  ArrayList<SolrInputDocument>();
docs.add( doc1 );
docs.add( doc2 );

 

  • 将documents提交给solr
Java代码 复制代码  收藏代码
  1. server.add( docs );  
server.add( docs );

 

  • 提交一个commit
Java代码 复制代码  收藏代码
  1. server.commit();  
 server.commit();
  • 在添加完documents后,立即做一个commit,你可以这样来写你的程序:
Java代码 复制代码  收藏代码
  1. UpdateRequest req = new UpdateRequest();    
  2.  req.setAction( UpdateRequest.ACTION.COMMIT, falsefalse );   
  3. req.add( docs );   
  4.  UpdateResponse rsp = req.process( server );    
    UpdateRequest req = new UpdateRequest(); 
req.setAction( UpdateRequest.ACTION.COMMIT, false, false );
req.add( docs );
UpdateResponse rsp = req.process( server );  

 

 

Streaming documents for an update

 

在很多的情况下,StreamingUpdateSolrServer也挺有用的。如果你使用的是solr1.4以上的版本的话,下面的代码,或许会用得着。下面的这种方法挺好用的,尤其是当你向服务器提交数据的时候。

.

 

CommonsHttpSolrServer server = new CommonsHttpSolrServer();
Iterator<SolrInputDocument> iter = new Iterator<SolrInputDocument>(){
public boolean hasNext() {
boolean result ;
// set the result to true false to say if you have more documensts
return result;
}
public SolrInputDocument next() {
SolrInputDocument result = null;
// construct a new document here and set it to result
return result;
}
};
server.add(iter);

 

you may also use the addBeans(Iterator<?> beansIter) method to write pojos 

Directly adding POJOs to Solr

  •    使用 java 注释创建java bean。@Field ,可以被用在域上,或者是setter方法上。如果一个域的名称跟bean的名称是不一样的,那么在java注释中填写别名,具体的,可以参照下面的域categories          
Java代码 复制代码  收藏代码
  1. import org.apache.solr.client.solrj.beans.Field;   
  2.   
  3.  public class Item {   
  4.     @Field  
  5.     String id;   
  6.   
  7.     @Field("cat")   
  8.     String[] categories;   
  9.   
  10.     @Field  
  11.     List<String> features;   
  12.   
  13.   }  
import org.apache.solr.client.solrj.beans.Field;
public class Item {
@Field
String id;
@Field("cat")
String[] categories;
@Field
List<String> features;
}

 

  • java注释也可以使用在setter方法上,如下面的例子:

        

Java代码 复制代码  收藏代码
  1. @Field("cat")   
  2.  public void setCategory(String[] c){   
  3.      this.categories = c;   
  4.  }  
  @Field("cat")
public void setCategory(String[] c){
this.categories = c;
}

          这里应该要有一个相对的,get方法(没有加java注释的)来读取属性

  • Get an instance of server
Java代码 复制代码  收藏代码
  1. SolrServer server = getSolrServer();  
 SolrServer server = getSolrServer();

 

  • 创建bean实例

        

Java代码 复制代码  收藏代码
  1. Item item = new Item();   
  2.  item.id = "one";   
  3.  item.categories =  new String[] { "aaa""bbb""ccc" };  
   Item item = new Item();
item.id = "one";
item.categories =  new String[] { "aaa", "bbb", "ccc" };

 

  • 添加给solr          
Java代码 复制代码  收藏代码
  1. server.addBean(item);  
server.addBean(item);

 

  • 将多个bean提交给solr

     

Java代码 复制代码  收藏代码
  1. List<Item> beans ;   
  2.  //add Item objects to the list   
  3.  server.addBeans(beans);     
 List<Item> beans ;
//add Item objects to the list
server.addBeans(beans);   

    注意: 你可以重复使用SolrServer,这样可以提高性能。

  Reading Data from Solr

  •    获取solrserver的实例

            

Java代码 复制代码  收藏代码
  1. SolrServer server = getSolrServer();  
SolrServer server = getSolrServer();

 

  •    构造 SolrQuery

     

Java代码 复制代码  收藏代码
  1. SolrQuery query = new SolrQuery();   
  2. query.setQuery( "*:*" );   
  3. query.addSortField( "price", SolrQuery.ORDER.asc );  
    SolrQuery query = new SolrQuery();
query.setQuery( "*:*" );
query.addSortField( "price", SolrQuery.ORDER.asc );

 

  •    向服务器发出查询请求

    

Java代码 复制代码  收藏代码
  1. QueryResponse rsp = server.query( query );     
QueryResponse rsp = server.query( query );   

 

  •    获取结果。

    

Java代码 复制代码  收藏代码
  1. SolrDocumentList docs = rsp.getResults();  
SolrDocumentList docs = rsp.getResults();

 

  •    想要以javabean的方式获取结果,那么这个javabean必须像之前的例子一样有java注释。
    Java代码 复制代码  收藏代码
    1. List<Item> beans = rsp.getBeans(Item.class);  
     List<Item> beans = rsp.getBeans(Item.class);
    
     

    高级用法

       solrJ 提供了一组API,来帮助我们创建查询,下面是一个faceted query的例子。

Java代码 复制代码  收藏代码
  1. SolrServer server = getSolrServer();   
  2.  SolrQuery solrQuery = new  SolrQuery().   
  3.                setQuery("ipod").   
  4.                setFacet(true).   
  5.                setFacetMinCount(1).   
  6.                setFacetLimit(8).   
  7.                addFacetField("category").   
  8.                addFacetField("inStock");     
  9.  QueryResponse rsp = server.query(solrQuery);  
 SolrServer server = getSolrServer();
SolrQuery solrQuery = new  SolrQuery().
setQuery("ipod").
setFacet(true).
setFacetMinCount(1).
setFacetLimit(8).
addFacetField("category").
addFacetField("inStock");  
QueryResponse rsp = server.query(solrQuery);

 所有的 setter/add 方法都是返回它自己本身的实例,所以就像你所看到的一样,上面的用法是链式的。

 


http://chatgpt.dhexx.cn/article/9W74VZWb.shtml

相关文章

sorl

solr&#xff1a; 层面搜索、命中醒目显示并且支持多种输出格式&#xff08;包括 XML/XSLT 和 JSON 格式&#xff09;&#xff0c;Solr 可以阅读和使用构建到其他 Lucene 应用程序中的索引。 安装&#xff1a;http://blog.csdn.net/millery22/article/details/51446014 对外提…

Solr和Solrj的使用

Solr(4.10.3)&Solrj 部署环境 1.拷贝solr solr-4.10.3\example\solr 目录到【如E:/solr/】,重命名solr为solrhome 【E:/solr/solrhome】 solrhome:solr里面有几个文件 collection1:有一个默认名称为collection1的SolrCore索引库 conf&#xff1a;SolrCore运行配置信息 co…

SolrJ的查询

1.solr是一个全文检索引擎系统,通过部署到tomcat下就可以独立运行,通过http协议对外提供全文检索服务, 就是索引和文档的正删改查服务 2. solr直接操作索引库和文档库, 我们的业务系统中可以使用solrJ(solr的客户端,就是一堆jar包)来调用solr服务端, 让solr服务端操作文档库和…

使用solrJ操作solr常用方法

既然学的是java那么肯定需要用java代码来进行对solr的操作&#xff0c;如果知道在solr后台管理界面进行增删改查等操作&#xff0c;那么用solrJ操作solr会更好理解。 solrJ介绍 solrJ是一个用来访问solr的java客户端&#xff0c;提供了索引和搜索的方法&#xff08;将一些常用…

solr快速上手:整合SolrJ实现客户端操作(九)

0. 引言 我们前面学习了solr的服务端基础操作&#xff0c;实际项目中我们还需要在客户端调用solr&#xff0c;就像调用数据库一样&#xff0c;我们可以基于solrJ来实现对solr的客户端操作 1. SolrJ简介 SolrJ 是 Solr官方提供的 Java 客户端库&#xff0c;主要用于与 Solr 服…

全文检索solr(五)Solrj的使用

什么是solrj solrj是访问Solr服务的java客户端&#xff0c;提供索引和搜索的请求方法&#xff0c;如下图&#xff1a; Solrj和图形界面操作的区别就类似于数据库中使用jdbc和mysql客户端的区别一样。 需求 使用solrj调用solr服务实现对索引库的增删改查操作。 环境准备 So…

Solr-Solrj简单使用

一、SolrJ简介 SolrJ是操作Solr的Java客户端&#xff0c;它提供了增加、修改、删除、查询Solr索引的Java接口。通过solrJ提供的API接口来操作solr服务&#xff0c;SolrJ底层是通过使用httpClient中的方法来完成Solr的操作。 二、依赖配置 <dependency><groupId>…

solrj

文章目录 1.什么是solrj?2.搭建工程2.1.导入相关jar包 3.对索引库做增删改查3.1.添加&#xff08;以实体类的方式&#xff09;添加方法 3.3.修改&#xff08;update&#xff09;3.4.删除以ID删除批量删除&#xff08;以ID&#xff09;以条件删除&#xff08;query&#xff09;…

Solr系列四:Solr(solrj 、索引API 、 结构化数据导入)

一、SolrJ介绍 1. SolrJ是什么&#xff1f; Solr提供的用于JAVA应用中访问solr服务API的客户端jar。在我们的应用中引入solrj&#xff1a; <dependency><groupId>org.apache.solr</groupId><artifactId>solr-solrj</artifactId><version>7…

solr学习之solrj

solrJ是访问Solr服务的JAVA客户端&#xff0c;提供索引和搜索的请求方法&#xff0c;SolrJ通常嵌入在业务系统中&#xff0c;通过solrJ的API接口操作Solr服务。 一 .maven的环境jar包配置 <!-- https://mvnrepository.com/artifact/org.apache.solr/solr-solrj --><d…

Pytorch实现逻辑斯蒂回归模型 代码实操

初学者学习Pytorch系列 第一篇 Pytorch初学简单的线性模型代码实操 第二篇 Pytorch实现逻辑斯蒂回归模型 代码实操 文章目录 初学者学习Pytorch系列前言一、先上代码二、测试结果1. 数据结果2.画图结果 总结 前言 上一篇的数据中&#xff0c;是这样子的例子 x_data代表的学习的…

回归分析(三)二项逻辑斯蒂回归模型

回归分析&#xff08;三&#xff09;二项逻辑斯蒂回归 学了一段时间突然又遇到逻辑斯蒂回归&#xff0c;结果发现已经忘完了&#xff0c;所以今天重新梳理一下。 &#xff08;1&#xff09;逻辑斯蒂分布 先看一下逻辑斯蒂分布函数 F ( x ) F(x) F(x)&#xff0c;其概率密度函数…

回归分析:逻辑斯蒂回归模型,可视化分类决策边界

文章目录 逻辑斯蒂回归模型逻辑斯蒂回归模型python案例 逻辑斯蒂回归模型 前面的例子都是在用线性模型解决回归任务&#xff0c;那么线性模型能否完成分类任务呢&#xff1f;相较于回归任务&#xff0c;分类任务的预测值是离散的&#xff0c;比如二分类问题&#xff0c;可以用…

机器学习:逻辑斯蒂回归

目录 逻辑回归模型介绍逻辑斯蒂分布二项逻辑斯谛回归模型目标函数 逻辑回归模型介绍 原理&#xff1a; 逻辑斯谛回归&#xff08;logistic regression&#xff09;是经典的分类方法&#xff0c;它属于对数线性模型&#xff0c;原理是根据现有的数据对分类边界线建立回归公式&a…

《PyTorch深度学习实践》06 逻辑斯蒂回归 代码

视频&#xff1a;06.逻辑斯蒂回归_哔哩哔哩_bilibili 参考文章&#xff1a;pytorch 深度学习实践 第6讲 逻辑斯蒂回归_会游泳的小雁的博客-CSDN博客 网络模型的基本框架 1步骤&#xff1a; 1.Prepare dataset 2.Design model using Class &#xff08;inherit from nn.Modul…

逻辑斯蒂回归 matlab实现

说明 我将试图从感知机的基础上说明逻辑回归的一般性原理和学习及预测方法&#xff0c;其中缺少一些必要的证明&#xff0c;包括了一个二分类问题的实例。其中关于感知机的实验在 机器学习 专栏中有介绍。 从感知机到逻辑斯蒂回归 感知机模型&#xff1a; 应用范围&#xf…

Lecture6 逻辑斯蒂回归(Logistic Regression)

目录 1 常用数据集 1.1 MNIST数据集 1.2 CIFAR-10数据集 2 课堂内容 2.1 回归任务和分类任务的区别 2.2 为什么使用逻辑斯蒂回归 2.3 什么是逻辑斯蒂回归 2.4 Sigmoid函数和饱和函数的概念 2.5 逻辑斯蒂回归模型 2.6 逻辑斯蒂回归损失函数 2.6.1 二分类损失函数 2.…

机器学习之逻辑斯蒂回归

目录 一、分类与回归 二、逻辑回归不是回归 三、生成式逻辑回归 四、判别式逻辑回归 五、逻辑回归为什么不用均方误差做损失函数 六、判别模型与生成模型的比较 七、写在最后 一、分类与回归 回归与分类是机器学习的基本问题。回归是预测连续值&#xff0c;分类是预测…

逻辑斯蒂回归算法

目录 逻辑斯蒂分布 二元逻辑斯蒂回归模型 二元逻辑斯蒂回归的损失函数及优化方法 二元逻辑斯蒂回归的正则化 多元逻辑斯蒂回归 逻辑斯蒂回归小结 LR的优点 LR的缺点 LR将连续特征离散化的原因 逻辑回归和线性回归的区别和联系 LR和SVM的关系 scikit-learn 逻辑回归…

逻辑斯蒂回归以及它的梯度下降法

文章目录 前言逻辑斯蒂分布 模型二项逻辑斯蒂回归模型多项逻辑斯蒂回归模型 策略算法如何求对数似然函数的最大值梯度下降法算法思想推导公式 注意 前言 预测任务分为&#xff1a; 回归问题&#xff1a;输入、输出变量为连续变量。分类问题&#xff1a;输出变量为有限个离散变…