初识SolrJ开发, schema.xml的配置与服务初始化.

schema.xml位于solr/collection1/conf/目录下,是Solr中用户定义字段类型及字段的配置文件.

Solr版本: 4.6.0

第一步: Schema.xml说明

实例schema.xml结构同solr/collection1/conf/schema.xml结构一致,具体配置通过注解已注明.

<?xml version="1.0" encoding="UTF-8" ?>
<schema name="example" version="1.5">
<fields><!--field属性说明:filed字段用于定义数据源字段所使用的搜索类型与相关设置.name:数据源字段名,搜索使用到.type:搜索类型名例如中文ika搜索名text_ika,对应于fieldType中的name.不需要分词的字符串类型,string即可,如果需要分词,types中配置好的分词type。indexed:是否被索引,只有设置为true的字段才能进行搜索排序分片(earchable, sortable, facetable)。stored:是否存储内容,如果不需要存储字段值,尽量设置为false以提高效率。multiValued:是否为多值类型,SOLR允许配置多个数据源字段存储到一个搜索字段中。多个值必须为true,否则有可能抛出异常。--><field name="id" type="string" indexed="true" stored="true" required="true" /> <field name="name" type="text_ik" indexed="true" stored="true" multiValued="false"/> <field name="phone" type="string" indexed="false" stored="true" /> <field name="email" type="string" indexed="false" stored="true" multiValued="true" /> <field name="city_id" type="int" indexed="true" stored="true" /> <field name="address" type="text_ik" index="true" stored="true" /> <field name="all" type="string" index="true" stored="true" /><!-- 动态字段定义通过*来定义  --><dynamicField name="*_i"  type="int"    indexed="true"  stored="true"/><dynamicField name="*_s"  type="string"  indexed="true"  stored="true"/></fields><!--uniqueKey节点设置主键,solr必须有一个主键,一般为id也可以自行定义.这个字段决定和增强文档的唯一性-->
<uniqueKey>id</uniqueKey><!--defaultSearchField节点默认搜索的字段,默认值为text, 如果我们已经将需要搜索的字段拷贝至all字段了,在这里设为all即可-->
<defaultSearchField>text</defaultSearchField> <!--solrQueryParser节点默认搜索操作符参数,及搜索短语间的逻辑,用AND增加准确率,用OR增加覆盖面,建议用AND,也可在搜索语句中定义。例如搜索"Java 多线程",使用AND默认搜索为"Java AND 多线程"-->
<solrQueryParser defaultOperator="OR"/><!--copyField节点如果我们的搜索需要搜索多个字段该怎么办呢?这时候,我们就可以使用copyField节点,我们将所有的中文分词字段全部拷贝至all中,当我们进行全文检索是,只用搜索all字段就OK了.
-->
<copyField source="name" dest="all" />
<copyField source="phone" dest="all" />
<copyField source="email" dest="all" /><types><!--定义字段处理类型  --><fieldType name="int" class="solr.TrieIntField" precisionStep="0" omitNorms="true" positionIncrementGap="0" /> <fieldType name="float" class="solr.TrieFloatField" precisionStep="0" omitNorms="true" positionIncrementGap="0" /> <fieldType name="double" class="solr.TrieDoubleField" precisionStep="0" omitNorms="true" positionIncrementGap="0" /> <fieldType name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true" /> <fieldType name="text" class="solr.TextField" positionIncrementGap="100"> <analyzer> <tokenizer class="solr.WhitespaceTokenizerFactory" /> </analyzer> </fieldType> <!-- 定义常规分词 类型--><fieldType name="text_general" class="solr.TextField" positionIncrementGap="100"><!-- 建立索引时的分词器配置 --><analyzer type="index"><!-- 建立索引时使用标准分词器 --><tokenizer class="solr.StandardTokenizerFactory"/><!-- 停用词过滤器, 用于索引文档中的停用词去掉 --><filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /><!-- 大写转小写过滤器 --><filter class="solr.LowerCaseFilterFactory"/></analyzer><!-- 查询的时候使用的分词器   --><analyzer type="query"><!-- 查询索引时使用标准分词器 --><tokenizer class="solr.StandardTokenizerFactory"/><!-- 停用词过滤器, 用于索引文档中的停用词去掉 --><filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" /><!-- 定义查询的时使用同义词过滤器   --><filter class="solr.SynonymFilterFactory" synonyms="synonyms.txt" ignoreCase="true" expand="true"/><!-- 大写转小写过滤器 --><filter class="solr.LowerCaseFilterFactory"/></analyzer></fieldType><!--定义IK分词类型--><fieldType name="text_ik" class="solr.TextField"><!--索引时候的分词器--><analyzer type="index" isMaxWordLength="false" class="org.wltea.analyzer.lucene.IKAnalyzer"/><!--查询时候的分词器--><analyzer type="query" isMaxWordLength="true" class="org.wltea.analyzer.lucene.IKAnalyzer"/></fieldType></types></schema>

在默认的solr/collection1/conf/schema.xml文件中,有如下field设定,其中title配置为允许多个值,所以我们抽象类中可以用集合标示.

<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="title" type="text_general" indexed="true" stored="true" multiValued="true"/>
<field name="author" type="text_general" indexed="true" stored="true"/>

第二步: 创建相应的抽象类

package com.test.model;
import java.io.Serializable;
import java.util.List;
import org.apache.commons.lang.builder.ToStringBuilder;public class Article implements Serializable{/*** */private static final long serialVersionUID = 4017316764889231758L;private String id;private List<String> title;private String author;public String getId() {return id;}public void setId(String id) {this.id = id;}public String getAuthor() {return author;}public void setAuthor(String author) {this.author = author;}public List<String> getTitle() {return title;}public void setTitle(List<String> title) {this.title = title;}@Overridepublic String toString() {return ToStringBuilder.reflectionToString(this);}}

第三步: 创建solr客户端

package com.plugin.solr.client;import java.util.Collections;
import java.util.HashMap;
import java.util.Map;import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;public class SolrClient {private static final Logger LOG = LoggerFactory.getLogger(SolrClient.class);private static Map<String, SolrServer> solrServerMap = Collections.synchronizedMap(new HashMap<String, SolrServer>());/*** 获取HttpSolrServer* * @param SOLR_URL* * @return SolrServer*/public static SolrServer getHttpSolrServer(final String solrURL) {SolrServer solrServer = null;if (!solrServerMap.containsKey(solrURL)) {try {solrServer = new HttpSolrServer(solrURL);if (solrServer != null) {solrServerMap.put(solrURL, solrServer);LOG.info("Load " + solrURL + " finish.");}} catch (Exception e) {LOG.warn("sorlURL error ," + solrURL);e.printStackTrace();}}return solrServerMap.get(solrURL);}
}

第四步: 编写客户端连接检测方法并测试

    /*** ping检测solr是否down掉 [测试通过]* @param server* @return*/public static String ping(SolrServer server){try {return server.ping().getResponse().toString();} catch (SolrServerException e) {LOG.error("Solr system ping error " + e.getMessage(), e);} catch (IOException e) {LOG.error("Solr system ping error " + e.getMessage(), e);}return null;}

启动tomcat服务器(前提是solr与tomcat已集成),本地tomcat端口为8888,编写junit测试

package com.test.search;import java.util.ArrayList;
import java.util.List;
import java.util.UUID;import org.apache.solr.client.solrj.SolrServer;
import org.junit.Before;
import org.junit.Test;import com.plugin.page.Page;
import com.plugin.solr.client.SolrClient;
import com.plugin.solr.engine.SolrEngineHandler;
import com.test.model.Article;public class SolrTest {private SolrServer server;@Beforepublic void init(){String solrURL = "http://localhost:8888/solr"; server = SolrClient.getHttpSolrServer(solrURL);}@Testpublic void pingSolr(){System.out.println("ping solr result: " +SolrEngineHandler.ping(server));}
}

运行结果

ping solr result: {responseHeader={status=0,QTime=656,params={df=text,echoParams=all,rows=10,echoParams=all,wt=javabin,version=2,q=solrpingquery,distrib=false}},status=OK}

连接成功.

转载请注明出处:[http://www.cnblogs.com/dennisit/p/3620597.html]

转载于:https://www.cnblogs.com/dennisit/p/3620597.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/421087.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实验3 编程、编译、链接、跟踪

本章的核心知识点在4.9节&#xff0c;王爽老师讲的特别清楚明白&#xff0c;多读几遍&#xff0c;跟着多做几遍&#xff0c;增加对底层的感觉&#xff1b; 本实验的目的是明白4.9节所讲的东西&#xff0c;具体点如下&#xff1a; 1&#xff0c;command&#xff0c;debug&…

Java动态查询

CODING COMING. // 组合模糊查询 根据年龄 和 姓名 模糊查询 学生。public List<Student> findTwo(int age, String name) {List<Student> list new ArrayList<Student>();StringBuffer sql new StringBuffer("select * from student where 1 1&quo…

前端学习(1033):jquery插件-图片懒加载

1下载插件 2html css和js引入 ctrlh 快速替换 必须最后插入

对自己有用的VS调试技巧

设置下一条语句编辑然后继续符号越界后查看堆对象查看数组的值底部设置下一条语句 返回顶部 一个典型的调试情况就是通过单步跟踪分析为什么一个函数调用失败了。当你发现一个函数调用的另一个函数返回错误的时候你会怎么做&#xff1f;重启调试&#xff1f;有更好的方法。拖动…

前端学习(1034):jquery插件-全屏滚动

fullpage.js 1下载插件 js css html 4引入

实验4 [bx]和loop的使用

(1) assume cs:codesgcodesg segmentmov ax, 0mov ds, axmov bx, 200H ;ds:bx数据区mov cx, 40hmov dl, 0 s: mov ds:[bx], dl ;dl中间变量inc bxinc dlloop smov ax, 4c00h int 21hcodesg ends end实验结果&#xff1a; &#xff08;2&#xff09; 考虑&#xff08;1&#…

面试 jsp转发和重定向

转发 HttpServletRequest 用法 req.getRequestDispatcher("studentServlet").forward(req, resp);重定向 HttpServletResponse 用法 resp.sendRedirect("studentServlet");区别 转发的主导权在服务器,重定向的主导权在客户端 转发可以用request传递数据…

好的API设计

[非原创&#xff0c;原文链接] API设计书籍下载&#xff1a; 1、keynote.pdf 2、api-design.pdf 最近在重构公司的一个交互中间件&#xff0c;在重新设计API及总体架构的时候思考了许多&#xff0c; 不禁萌发了一个疑问&#xff0c;什么样的API才算是一个设计良好的API呢&…

前端学习(1035):bootstrap-js插件1

1引入css和js 2复制html 组件 3运行之后得到下拉框

面试之JSP九大内置对象和JSP四大作用域

jsp 九大内置对象和其作用详解 JSP中一共预先定义了9个这样的对象&#xff0c;分别为&#xff1a;request、response、session、application、out、pagecontext、config、page、exception 1、request对象 request 对象是 javax.servlet.httpServletRequest类型的对象。 该对象…

实验5 编写、调试具有多个段的程序

本章实验的主题主要讲代码段、数据段、栈段的使用。 &#xff08;1&#xff09; assume cs:code, ds:data, ss:stackdata segmentdw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987h data endsstack segmentdw 0, 0, 0, 0, 0, 0, 0, 0 stack endscode segment start:…

[物理学与PDEs]第1章第6节 电磁场的标势与矢势 6.3 例 --- 电偶极辐射

1. 偶极子: 相距为 $l$, 带电量分别为 $\pm q$ 的一对电荷组成的系统. 称 $$\bex {\bf m}q{\bf l} \eex$$ 为电偶极矩, 其中 ${\bf l}$ 为 $-q$ 到 $q$ 的向量. 2. 取 ${\bf l}$ 为 $z$ 轴, 考虑偶极子的振动: $$\bex {\bf l}(t)l_0 e^{-i\omega t} {\bf e}_3. \eex$$ 则 (1) $…

前端学习(1036):bootstrap-js插件2

1大模态框 引入html 自己定义 2说明 就可以显示 js调用 script

实验6 实践课程中的程序

本实验书中已经有源码&#xff08;158页&#xff09;&#xff0c;稍微改动一下即可。本题中值得学习的地方就是用双重循环遍历二位数组&#xff0c;这在C语言中很简单&#xff0c;但是在汇编中要注意cx的在内外层循环之间的切换情况。 assume cs:codesg, ds:datasg, ss:stacksg…

字符流读取,乱码问题

碰到问题&#xff0c;字符流读取文本文件&#xff0c;读取输出&#xff0c;强转成char出现乱码问题。 题目 用流统计文本文件的字符个数 public static int getSum() {int count 0;BufferedReader br null;try {// 字节流转换为字符流&#xff0c; 设置编码。br new Buffere…

实验7 寻址方式在结构化数据访问总的应用

做本实验时明显感觉寄存器不够用&#xff0c;所以要对bx&#xff0c;si&#xff0c;di&#xff0c;bp的使用仔细阅读&#xff0c;本题比较琐碎&#xff0c;做本题更需要的是耐心&#xff0c;耐心&#xff0c;耐心。 assume cs:codedata segment db 1975,1976,1977,1978,1979,…

Jsp传值方式(乱码问题的解决)

一&#xff0c;Jsp页面的三种传值方式 1&#xff0c;地址栏传值&#xff08;get提交&#xff09; 2&#xff0c;a标签传值 &#xff08;get提交&#xff09; 3&#xff0c;表单提交 &#xff08;默认get方式提交&#xff09; Get/post取中文都会乱码。 Jsp的内置对象request…

生活小感想3

机会永远给有准备的人&#xff0c;不准备永远不会有机会&#xff0c;与其悲天悯人&#xff0c;不如用今天的辛苦换取明天的幸福。 共勉 转载于:https://www.cnblogs.com/luckyflower/p/3633119.html

实验8 分析一个奇怪的程序

仔细阅读9.3节依据位移进行转移的jmp指令&#xff0c;然后理解下面的这个很奇怪的程序就容易多了&#xff0c;当然要看着机器码去分析。 assume cs:codesgcodesg segmentmov ax, 4c00hint 21hstart: mov ax, 0 s: nopnopmov di, offset smov si, offset s2mov ax, cs:[si]mov c…

原来访问网页弹出cookie是这样的

Cookie 是由服务器生成发送给浏览器&#xff0c;浏览器会将Cookie的key/value保存到某个目录下的文本文件内&#xff0c;经过加密的&#xff0c;下次请求同一网站时&#xff0c;就发送该cookie给服务器。以名值对&#xff0c;储存少量信息。 servlet设置cookie Cookie c new C…