Apache Solr初体验四

摘要:
几次前,我们讨论了solr的基本用法和配置文件,然后我们开始了真正的代码旅程(=null){date=newSimpleDateFormat.format;}System.out。println;}}此时,我们使用EmbeddedSolrServer,它用于嵌入式solr服务。在这里,我们不需要提供外部服务,所以我们使用这个。此外,还有一个CommonsHttpSolrServer类用于发送命令。例如,如果需要发送HTTP命令进行查询,我们可以使用这个类。接下来,我们初始化容器并让它加载solr.home的配置文件。我们构造后的参数列表如下:facet。日期start=2004-01-01T00%3A00%3A000Z&indent=on&facet。date=制造日期_ dt&hl.fl=name&face.date.gap=%2B1YEAR&wt=xml&facet.date。结束=2010-01-01T00%3A00%3A000Z&face=true&fl=name%2Cprice%2Cscore&q=solr&sort=price+asc&hl=true与我们在浏览器中直接输入的不同,因为它已经编码。

前几次我们讲到了solr的基本用法和配置文件,接下来就开始进入我们真正的代码之旅啦。

    1)首先以一个简单的程序来开头:

public static void main(String[] args) throws SolrServerException, IOException, ParserConfigurationException, SAXException{  

//设置solr.home,注意这时通过环境变量是solr.solr.home
System.setProperty("solr.solr.home","E:\\solr");
//初始化容器,让它加载solr.home的配置文件
CoreContainer.Initializer initializer = new CoreContainer.Initializer();
CoreContainer coreContainer = initializer.initialize();

EmbeddedSolrServer solrServer = new EmbeddedSolrServer(coreContainer,"");
//构造参数列表
SolrQuery solrQuery = new SolrQuery();
Map<String,String> map = new HashMap<String,String>();
map.put(FacetParams.FACET_DATE, "manufacturedate_dt");
map.put(FacetParams.FACET_DATE_START,"2004-01-01T00:00:00Z");
map.put(FacetParams.FACET_DATE_END,"2010-01-01T00:00:00Z");
map.put(FacetParams.FACET_DATE_GAP,"+1YEAR");
map.put("indent","on");
map.put("wt","xml");
map.put("hl.fl","name");
SolrParams params = new MapSolrParams(map);
solrQuery.add(params);
solrQuery.setFacet(true);
solrQuery.setFields("name,price,score");
solrQuery.setQuery("solr");
solrQuery.setSortField("price",SolrQuery.ORDER.asc);
solrQuery.setHighlight(true);

System.out.println(solrQuery.toString());

QueryResponse queryResponse = solrServer.query(solrQuery);
System.out.println(queryResponse.toString());
System.out.println("共找到:"+queryResponse.getResults().getNumFound()+"个结果");
//解析返回的参数
SolrDocumentList sdl = (SolrDocumentList)queryResponse.getResponse().get("response");
for (int i = 0; i< sdl.size(); i++){
Object obj = sdl.get(i).get("manufacturedate_dt");
String date = "";
if (obj!= null){
date = new SimpleDateFormat("yyyy-MM-dd").format((Date)obj);
}

System.out.println(((SolrDocument)sdl.get(i)).get("name")+":"+date+":"+(sdl.get(i).get("price")));
}
}


     这时我们所用到的是EmbeddedSolrServer,它是用于嵌入式地solr服务,这里我们不需要向外提供服务,所以我们就用到这个。另外有一个

CommonsHttpSolrServer这个类是用于发送指令的服务,例如我们需要发送HTTP命令来查询,就可以用这个。

    下面我们分析一下代码,首先,我们设置了一个环境变量的名称为solr.solr.home,是这个,你没看错,确实是要这样。接下来我们初始化容器,让它加载solr.home的配置文件等。接下来的一系统代码就是构造参数列表。

    我们构造完成后的参数列表是这样的:facet.date.start=2004-01-01T00%3A00%3A00Z&indent=on&facet.date=manufacturedate_dt&hl.fl=name&facet.date.gap=%2B1YEAR&wt=xml&facet.date.end=2010-01-01T00%3A00%3A00Z&facet=true&fl=name%2Cprice%2Cscore&q=solr&sort=price+asc&hl=true

    跟我们直接在浏览器输入的不太一样,因为它是进行过编码的。构造完成后我们就可以用solrServer进行查询了。

    查询得到的结果是JSON格式的,注意,通过程序来查询得到的都是JSON格式,而不是XML格式,不过这样更好,方便我们进行接下来的解析。

    接下来的代码就是解析内容啦,应该很容易看懂的。

    2)接下来的我们就尝试自己写一个程序来进行索引,而不用post.jar。

    程序代码如下:

public static void main(String[] args) throws IOException, ParserConfigurationException, SAXException{  

System.setProperty("solr.solr.home","e:\\solrIndex");

//这下面三行代码主要是用于加载配置文件
SolrConfig solrConfig = new SolrConfig("E:\\solrIndex\\conf\\solrconfig.xml");
FileInputStream fis = new FileInputStream("E:\\solrIndex\\conf\\schema.xml");
IndexSchema indexSchema = new IndexSchema(solrConfig,"solrconfig",fis);

SolrIndexWriter siw = new SolrIndexWriter("solrIndex","E:\\solrIndex",new StandardDirectoryFactory()
,true,indexSchema);
Document document = new Document();
document.add(new Field("text","测试一下而已",Field.Store.YES,Field.Index.ANALYZED,Field.TermVector.WITH_POSITIONS_OFFSETS));
document.add(new Field("test_t","再测试一下而已",Field.Store.YES,Field.Index.ANALYZED,Field.TermVector.WITH_POSITIONS_OFFSETS));
siw.addDocument(document);

siw.commit();
siw.close();

SolrCore solrCore = new SolrCore("E:\\solrIndex",indexSchema);

SolrIndexSearcher sis = new SolrIndexSearcher(solrCore,indexSchema,"solrIndex",
new StandardDirectoryFactory().open("E:\\solrIndex"),true);
TopDocs docs = sis.search(new TermQuery(new Term("test_t","再")),1);

System.out.println("找到"+docs.totalHits+"个结果 ");

for (int i = 0; i < docs.scoreDocs.length; i++) {
System.out.println(sis.doc(docs.scoreDocs[i].doc).get("test_t"));
}

}


     代码不难理解,所以就没写注释了。主要是那段加载配置文件的代码。接下来是添加索引,然后是查询索引,删除的比较简单,直接一句代码

solrServer.solrServer.deleteById("SOLR1000");  

     或者

solrServer.deleteByQuery()  

     都比较简单。

    3)接下来我们讲一下,很可能会在项目中用到的,就是中文分词,中文分词有蛮多的,有IK,Paoding,mmseg4j,还有另外一些中科院什么地方的。但个人建议用IK或者mmseg4j,这两个有solr都有比较直接的支持,paoding也可以,但可能需要自己写类继承BaseTokenizerFactory然后再进行配置,不难。

    上面的例子就是用到中文分词了,如果你发现找不到结果,那很正常,因为还没添加中文分词,你可以把中文改成英文,再查一下,就可以查出来了。

    需要添加中文分词,我们要在schema.xml中做文章。找到types标签,在里面找到你想要进行中文分词的类型,比如text类型,我们想要让它的内容用中文分词来进行分析,可以进行配置:

<analyzer type="index">  
<tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory"/>
<filter class="solr.StopFilterFactory"
ignoreCase
="true"
words
="stopwords.txt"
enablePositionIncrements
="true"
/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="1" catenateNumbers="1" catenateAll="0" splitOnCaseChange="1"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
</analyzer>
<analyzer type="query">
<tokenizer class="org.wltea.analyzer.solr.IKTokenizerFactory"/>
<filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/>
<filter class="solr.StopFilterFactory"
ignoreCase
="true"
words
="stopwords.txt"
enablePositionIncrements
="true"
/>
<filter class="solr.WordDelimiterFilterFactory" generateWordParts="1" generateNumberParts="1" catenateWords="0" catenateNumbers="0" catenateAll="0" splitOnCaseChange="1"/>
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.SnowballPorterFilterFactory" language="English" protected="protwords.txt"/>
</analyzer>


     你可以先不理解filter的那些东西,但你一定要理解tokenizer这些地方的配置,它配置了你想要应用的分词器,它必须继承于BaseTokenizerFactory。我们看到analyzer有一个type属性,它表示你要在哪个阶段运用此分词器,如果索引和查询都要用,我们可以不写type,这样solr就会在索引和查询时都使用此分词器,这样配置完成后就可以进行中文分词的测试啦。我们重新把上面的例子添加中文进行索引,然后查询出来,看有没有问题。我的运行结果如下:

Apache Solr初体验四第1张


     我们找到了结果,证明我们的中文分词已经没问题了。

免责声明:文章转载自《Apache Solr初体验四》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇两个springboot项目如何部署在同一个服务上,两个spring启动应用程序部署在同一台服务器上论文阅读笔记(六十九)【CVPR2021】:BiCnet-TKS: Learning Efficient Spatial-Temporal Representation for Video Person Re-Identification下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

全文搜索技术—Solr

1.   学习计划   1. Solr的安装及配置 a)    Solr整合tomcat b)    Solr后台管理功能介绍 c)    配置中文分析器   2. 使用Solr的后台管理索引库 a)    添加文档 b)     删除文档 c)    修改文档 d)    查询文档   3. 使用SolrJ管理索引库 a)    添加文档 b)    修...

solr 基本命令二(权重查找)

package zr.com.solr.utils; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.management.Query; import org.apache.s...

Solr搜索引擎入门知识汇总

1.技术选型,为什么用solr而不用lucene,或者其他检索工具 lucene:需要开发者自己维护索引文件,在多机环境中备份同步索引文件很是麻烦 Lucene本质上是搜索库,不是独立的应用程序。而Solr是。 Lucene专注于搜索底层的建设,而Solr专注于企业应用。 Lucene不负责支撑搜索服务所必须的管理,而Solr负责。 一句话概括Solr:...

Solr专题(一)手把手教你搭建Solr服务

一、Solr是什么,能解决什么问题? Solr是一个高性能,采用Java开发,基于Lucene的全文搜索服务器。同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置、可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎。 简而言之就是在项目中可以作为搜索引擎,提供资源的高效查询。 Q:数据库不...

ssm(Spring、Springmvc、Mybatis)实战之淘淘商城-第八天(非原创)

文章大纲 一、课程介绍二、Solr基本介绍三、ssm整合Solr四、项目源码与资料下载五、参考文章 一、课程介绍 一共14天课程(1)第一天:电商行业的背景。淘淘商城的介绍。搭建项目工程。Svn的使用。(2)第二天:框架的整合。后台管理商品列表的实现。分页插件。(3)第三天:后台管理。商品添加。商品类目的选择、图片上传、富文本编辑器的使用。(4)第四天:...

Apache Solr配置

Solr配置 Solr的主要功能是全文检索,该功能分为两个过程:创建索引和对索引进行搜索; 在创建索引之前,需要重点关注两个配置文件:SOLR_HOME/collection1/conf/schema.xml(定义Document的结构类似定义DB的表结构) & solrconfig.xml(solr运行配置如请求如何被处理);在Solr创建索引...