设为首页 收藏本站
查看: 880|回复: 0

[经验分享] solr的基本应用

[复制链接]
累计签到:2 天
连续签到:1 天
发表于 2016-12-15 07:56:17 | 显示全部楼层 |阅读模式
一、Solr的特性:
    Apache Solr是一个开源的搜索服务器,使用java语言开发,主要基于http和Apache Lucene实现。定制solr索引的方法就是用psot方法向solr服务器发送一个描述所有Field及其内容的xml文档就行了,solr开始支持从数据库(通过JDBC)、RSS提要、Web页面和文件中导入数据,但是不直接支持从二进制文件中读取内容(pdf,MS office)。更重要的是,Solr创建的索引与Lucene搜索引擎库完全兼容。
二、Solr服务器原理:
    Solr对外提供标准的http接口来实现对数据的索引的增加、删除、修改、查询。Solr的工作流程大概是这样的:用户通过向部署在servlet容器中的Solr Web应用程序发送http请求来启动索引和搜索。solr接受请求,确定要使用适当的SolrRequestHandler,然后处理请求。通过HTTP以同样的方式返回相应。默认配置返回solr的标准XML相应,也可以配置Solr的备用相应格式。
三、Solr的分词配置:
    solr的缺省的中文分词方案可以采用mmseg4j 项目库:http://code.google.com/p/mmseg4j,也可以采用庖丁解牛(lucene)作为solr的缺省的中文分词方案  项目库:http://code.google.com/p/paoding/
四、Solr的多core配置(MultiCore):
    、、、、、、、、、、、、、
五、Solr的索引配置:
    、、、、、、、、、、、、、
六、Solr的配置文件:
    1、schema.xml:相当于数据表配置文件,他定义了加入索引的数据的数据类型,主要包括:types、fields和其他的一些缺省配置。
    <uniqueKey>id</uniqueKey>:这个配置将id字段作为索引文档的唯一标识符,非常重要
<fields>
<field name="id" type="integer" indexed="true" stored="true" required="true"/>
<field name="name" type="text" indexed="true" stored="true"/>
<field name="email" type="text" indexed="true" stored="true" multiValued="true"/>
<field name="copy_email" type="text" indexed="true" stored="false" multiValued="true"/>
<copyField source="email" dest="copy_email"/>
<dynamicField name="attr_*" type="text_general" indexed="true" stored="true" multiValued="true"/>
</fields>
/**
name是定义的字段名
type为字段类型,可以是基本的也可以是自定义的
indexed表示是否被索引
stored表示字段是否被存储,如果为false表示可以进行检索,但是不能够现实该字段的内容(搜索的字段内容不保存到返回结果中).
multiValued表示是否又多个值
required为true时表示当字段没有值,则solr会索引文档失败
dynamicField为定义的动态字段,定义字段名称的规则,那么任何以attr_开头的字段都被认为符合这个定义的.
*/
2、solrconfig.xml:它制定了Solr如何处理索引、突出显示、分类、搜索以及其他请求,还指定了用于指定缓存的处理方法的属性,以及用于指定Lucene管理索的方法的属性



七、Solr的应用模式:
    1、对于原油系统已有的数据或需要索引的数据量较大的情况:
        这种情况直接采用通过http方式调用solr的接口方式效率较差,应采用solr本身对cvs的支持,将数据导出为csv格式,然后调用solr的csv接口。
        、、、、、、、、
    2、对于系统新增的数据:
        将数据组装成xml格式,直接调用solr的http接口。
        数据库数据导入生成索引:可以通过程序将数据读取出来,如果内存够大可以读取100甚至1000条或者更多,然后放到Collection中批量提交到solr,但是我们还可以通过配置文件直接读取数据库建立索引。
            (1) 全量更新索引
                 一、提供对应数据库的jdbc驱动.将jdbc驱动放在TOMCAT_HOME\webapps\solr\WEB_INF\lib目录下。
                 二、在c:\solr-tomcat\solr\conf目录下新建db文件夹,在db文件夹中新建db-data-config.xml:
<dataConfig>
<dataSource type="jdbcDataSource" driver="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@192.168.11.1:1521:数据库名" user="#" password="#"/>
<document name="messages">
<entity name="message" transformer="ClobTransformer" query="select * from tb_message">
<field column="ID" name="id"/>
<field column="TITLE" name="title"/>
<field column="CONTENT" clob="true" name="content"/>
<field column="SENDTIME" name="sendtime"/>
</entity>
</document>
</dataConfig>
                 三、修改c:\solr-tomcat\solr\conf目录下的solrconfig.xml文件,添加如下代码:
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">c:\solr-tomcat\solr\conf\db\db-data-config.xml</str>
</lst>
</requestHandler>

document:一个文档、也是lucene的document.
entity:主要针对的是一个数据库表
field:属性column是数据库的字段,name是field的名字(schema的field)
                四、启动tomcat,输入地址进行导入,导入分为多种模式:这里使用的是完全导入模式 http://localhost:8080/solr/dataimport?command=full-import
                五、扩展:
                    上面的例子只不过是很简单的一个部分,针对solr的MultiCore,可以配置db-data-config.xml也可以实现,还有多表或者是多表关联等等操作,只要在db-data-config.xml中配置清楚都可以进行数据的导入。solr1.4有很多功能为重建索引提供很方便的操作。而且datasource不单单指的是database,也可以是xml文件或者来自网络上的一些内容。
            (2) 增量更新索引:
                1、首先确认表中有last_modified字段。
                2、修改c:\solr-tomcat\solr\conf\db\db-data-config.xml文件,内容如下:
<dataConfig>
<dataSource type="jdbcDataSource" driver="oracle.jdbc.driver.OracleDriver" url="jdbc:oracle:thin:@192.168.11.1:1521:数据库名" user="#" password="#"/>
<document name="message">
<entity name="message" pk="ID" transformer="ClobTransformer"
query="select * from tb_message"
delaQuery="select id from tb_message where to_char(last_modified,'YYYY-MM-DD HH24:MI:SS')">'${dataimport.last_index_time}'>
<field column="ID" name="id"/>
<field column="TITLE" name="title"/>
<field column="CONTENT" clob="true" name="content"/>
<field column="SENDTIME" name="sendtime"/>
</entity>
</document>
</dataConfig>
                 3、重启tomcat,添加一条记录http://localhost:8089/solr/dataimport?command=delta-import
    3、嵌入式solr
        、、、、、、、、、
    4、分布式索引
        、、、、、、、、、

八:Solr的使用步骤:
    1、搜索引擎规划设计
        定制好业务模型:分析确定有哪些内容需要进行检索,这些内容的来源,更新的频次等信息,
        定制好索引结构:定制索引服务就是对索引源进行结构化的索引,即索引后的结果是结构化的有意义的信息。主要涉及一下几点:(1)分类:多核解决方案 (2)需要检索的字段 (3)需要存储的方案  (4)过滤的条件  (5)排序  (6)索引的跟新频次.
        定制好搜索策略:指的是确定搜索支持的规则(1)过滤条件  (2)排序规则
    2、搜索引擎配置
        根据搜索引擎的规划,配置solr的schema.xml等配置文件:配置好Fieldtype、Fields、copyField、dynamicField的配置。
    3、构建索引并定时更新索引
        通过调用索引接口进行索引的构建与更新:
    4、搜索
        1、solr的查询参数说明
            1) q        -- 查询字符串
            2)fl       -- 指定返回那些字段的内容,用逗号或空格分隔多个
            3)start    -- 返回第一次记录在完整找到结果中的偏移位置,0开始
            4) rows     -- 指定返回结果最多有几条记录,一般配合start来实现分页
            5) sort     -- 排序 注意:排序只能针对数值型.
            6) wt       -- 指定输出格式,可以有xml,json,php
            7) fq       -- 过滤查询,在q查询符合结果中同时是fq查询符合的.例如:q=mm&fq=date_time:[200809 TO 201206],找到关键字mm,并且date_time是200809到201206之间的。
        2、solr检索的运算符
            1)":"       -- *:*查询所有,id:1查询id为1的内容
            2)"?"       -- 表示单个任意字符的通配
            3)"*"       -- 表示多个任意字符的通配
            4)"~"       -- 表示模糊检索,如检索类似于“roam”的内容:roam~将找到foam和roams的单词,roam~0.8表示检索返回相似度在0.8以上的记录。
            5)"^"       -- 控制相关度检索,如检索jakarta apache,同时希望"Jakarta"的相关度更加好,那么在其后加上"^"和增量值,即:jakarta^4 apache
            6)布尔操作符AND、||  OR、&&   NOT、!
            7)"-" 排除操作符不能单独与项使用构成查询  "+" 存在操作符,要求符号"+"后的项在文档相应的域中存在.
            DSC0000.gif "()"      --用于构成子查询
            9)"[]"、"{}" --范围检索.如date:[200707 TO 200710]表示包含头(200707)和尾(200710),而date:{200707 TO 200710}表示不包含头和尾.
            10)"\"       -- 转义字符,将特殊字符转义:"+ - && || ! () {} [] ^ ~ * ? : \"
        3、查询规则.
           1)要限定输出结果的内容用"fl="加上你要的字段名称:
                http://localhost:8080/solr/q=text:北京+ OR+text:亿度&start=0&rows=10&fl=name,address,tel  在返回的结果中只包括name、address以及tel三个内容.
           3)若搜寻联集结果,用OR连接:
               text:海淀 OR text:亿度
           4)若搜寻交集结果,用AND 或者 "+":
               text:海淀 AND 亿度    +text:海淀 +text:亿度   name:(+亿度 +海淀)
           5)排除查询:在排除词前加上"-"
               海淀 -亿度      这样搜索结果不会有包含亿度的词在结果中
           6)增加权重: 如搜寻“北京 加油站”,因为回传的资料大多包含“中国”或“加油站”的结果,所以想要把包含“加油站”的数据往前排,可以使用“^”在后面加上愈增加权重数:  北京 加油站^2     这样在搜寻时会先判断加油站这个词在搜寻结果中的比重,甚至假设一笔数据内加油站出现过两次以上的就更加具有优先权。
               title:(test1 test2)^4 content:(test1 test2)这样就给title字段增加权重,进行优先匹配。
           7)*符号:如果查询条件为“中国*银”    --他表示中国及银之间可夹任何长短字词    --那么结果会有 中国信托商业银行、中国输出入银行图书馆阅览室、中国商银证券   

Solr的分词器、过滤器、分析器的学习:
    分析就是组合分词和过滤:对于一个document进行索引时,其中的每个Field中的数据都会经历分析,最终讲一句话分成单个的单词,去掉句子当中的空白符号,大写转换为小写,复数转为单数,去掉多余的词,进行同义词代换等等。
    分析器(Analyzer)
        分析器是包含两个部分,分词器和过滤器。分词器功能将句子分成单个的词元token,过滤器就是对词元进行过滤。
        solr自带了一些分词器,如果你需要使用自定义的分词器,需要修改schema.xml,schema.xml文件允许两种凡是修改文本被分析的方式,通常只有field类型为solr.TextField的field的内容允许定制分析器。
        方法一:使用任何org.apache.lucene.analysis.Analyzer的子类进行设定。
<fieldType name="text_ws" class="solr.TextField" positionIncrementGap="100">
<analyzer>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
</analyzer>
</fieldType>
        方法二:制定一个TokenizerFactory,后面跟一系列的TokenFilterFactories(他们将按照所列的顺序发生作用),Factories被用来创建分词器和分词过滤器,他们用于对分词器和分词过滤器的准备配置,这样做的目的是为了避免(通过反射创建的开销)
<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" />
<!-- in this example, we will only use synonyms at query time
<filter class="solr.SynonymFilterFactory" synonyms="index_synonyms.txt" ignoreCase="true" expand="false"/>
-->
<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>

        注意:任何Analyzer、TokenizerFactory、TokenFilterFactory应该带包名的全类名进行指定,并确保他们位于Solr的classpath路径下。如果需要自己的分词器或者过滤器,需要自己写一个factory,但是它必须是BaseTokenizerFactory(分词器)或BaseTokenFilterFactory(过滤器)的子类。
        solr提供的TokenizerFactories:
            1、solr.LetterTokenizerFactory
                分词举例:I can*t  ====》  I   can   t   字母切词
            2、solr.WhitespaceTokenizerFactory
                切除所有空白字符
            3、solr.LowerCaseTokenizerFactory
                分词举例:I can*t   ====》 i can t   主要是大写转小写
            4、solr.StandardTokenizerFactory
                该分词器会自动的给每个分词添加type,以便接下的对type敏感的过滤器进行处理,目前仅仅只有StandardFilter对Token的类型是敏感的。
                分词举例:I.B.M    cat*s   can*t  ====》ACRONYM:"I.B.M",APOSTROPHE:"cat*s",APOSTROPHE:"can*t"
            5、solr.HTMLStripWhitespaceTokenizerFactory
                从结果中除去HTML标签,将结果交给WhitespaceTokenizer处理。
                分词举例:my <a href="#">link</a>   ====》  my link
            6、solr.HTMLStripStandardTokenizerFactory
                从结果中除去HTML标签,将结果交给StandardTokenizer处理。
            7、solr.PatternTokenizerFactory
                说明:按照规则表达式对文本进行分词
                分词举例:处理对象 mice; kittens;  dogs,他们由分号加一个或多个空格分隔,
<filedType name="semicolonDelimited" class="solr.TextField">
<analyzer>
<tokenizer class="solr.PatternTokenizerFactory" pattern="; *"/>
</analyzer>
</fieldType>

        solr提供的TokenFilterFactories:
            1、solr.StandardFilterFactory:
               移除首字母简写中的点和Token后面的 ’s。仅仅作用域由StandardTokenizer产生的有类的Token。
               分词实例:I.B.M cat's can't  ====>  IBM cat  can't
            2、solr.TrimFilterFactory
               去掉Token两端的空白符。
               分词实例:" Kittens!  ", "Duck" ====> "Kittens!","Duck"
            3、solr.LowerCaseFilterFactory
            4、solr.StopFilterFactory:
               去掉如下的通用词,多为虚词:a,an,and,are,as,at,be,but,by,for,if,in,into,is,it,no等
<fieldtype name="testtop" class="sole.TextField">
<analyzer>
<tokenizer class="solr.LowerCaseTokenizerFactory"/>
<filter class="solr.StopFilterFactory" words="stopwords.txt" ignoreCase="true"/>
</analyzer>
</fieldtype>
            5、solr.KeepWordFilterFactory
                作用与solr.StopFilterFactory相反,保留词的列表
            6、solr.LengthFilterFactory
                过滤掉长度在某个范围之外的词。
<fieldtype name="lengthfilt" class="solr.TextField">
<analyzer>
<tokenizer class="solr.WhitespaceTokenizerFactory"/>
<filter class="solr.LengthFilterFactory" min="2" max="5"/>
</analyzer>
</fieldtype>
            7、solr.ProterStemFilterFactory
               采用Porter Steming Algorithm算法去掉单词的后缀,例如将复数形式变为单数形式
            8、solr.EnglishPorterFilterFactory
                关于句子主干的处理,其中的“protected”指定不允许修改的词的文件
            9、solr.WordDelimiterFilterFactory:关于分隔符的处理
            10、solr.SynoymFilterFactory
                关于同义词的处理
            11、solr.RemoveDuplicatesTokenFilterFactory:避免重复处理.

http://www.open-open.com/doc/vie ... ba18a097d1829646549

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-314381-1-1.html 上篇帖子: solr 技术分享稿 下篇帖子: 关于solr QueryElevationComponent 的问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表