黑马程序员技术交流社区

标题: 【广州校区】+【原创】solr [打印本页]

作者: 余大麻    时间: 2018-12-6 11:10
标题: 【广州校区】+【原创】solr
1.solr概要A.solr简介B.solr和lucene区别2.solr安装(解压war包-->补全jar包-->配置solrHome)A.解压war包B.把war包拷贝到tomcat的webapp下C.补全迁移中缺少的jar包D.配置solr的家(索引库)E.配置家目录F.启动tomcat--->ok提示:solrHome中有关配置2.索引的操作A.添加索引库5.中文分析器配A.Schema.xml
[XML] 纯文本查看 复制代码
<copyField source="cat" dest="text"/>
<copyField source="name" dest="text"/>
<copyField source="manu" dest="text"/>


dynamicField(动态域)

[XML] 纯文本查看 复制代码
<dynamicField name="*_i"  type="int"    indexed="true"  stored="true"/>
<dynamicField name="*_is" type="int"    indexed="true"  stored="true"  multiValued="true"/>
<dynamicField name="*_s"  type="string"  indexed="true"  stored="true" />


B.安装中文分词器
[XML] 纯文本查看 复制代码
<!-- IKAnalyzer-->
<fieldType name="text_ik" class="solr.TextField">
    <analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType>

[XML] 纯文本查看 复制代码
<!--IKAnalyzer Field-->
<field name="title_ik" type="text_ik" indexed="true" stored="true" />
<field name="content_ik" type="text_ik" indexed="true" stored="false" multiValued="true"/>
C.设置业务系统Field
[XML] 纯文本查看 复制代码
<!--product-->
<field name="product_name" type="text_ik" indexed="true" stored="true"/>
<field name="product_price"  type="float" indexed="true" stored="true"/>
<field name="product_description" type="text_ik" indexed="true" stored="false" />
<field name="product_picture" type="string" indexed="false" stored="true" />
<field name="product_catalog_name" type="string" indexed="true" stored="true" />

<field name="product_keywords" type="text_ik" indexed="true" stored="false" multiValued="true"/>
<copyField source="product_name" dest="product_keywords"/>
<copyField source="product_description" dest="product_keywords"/>


6.Solr管理索引库A.添加/更新文档B.批量导入数据
[XML] 纯文本查看 复制代码
<requestHandler name="/dataimport" 
class="org.apache.solr.handler.dataimport.DataImportHandler">
    <lst name="defaults">
        <str name="config">data-config.xml</str>
    </lst>
</requestHandler>


[XML] 纯文本查看 复制代码
<?xml version="1.0" encoding="UTF-8" ?>  
<dataConfig>   
    <dataSource type="JdbcDataSource"   
        driver="com.mysql.jdbc.Driver"   
        url="jdbc:mysql://localhost:3306/lucene"   
        user="root"   
        password="root"/>   
    <document>   
        <entity name="product" query="SELECT pid,name,catalog_name,price,description,picture FROM products ">
            <field column="pid" name="id"/>
            <field column="name" name="product_name"/>
            <field column="catalog_name" name="product_catalog_name"/>
            <field column="price" name="product_price"/>
            <field column="description" name="product_description"/>
            <field column="picture" name="product_picture"/>
        </entity>   
    </document>   
</dataConfig>


C.删除文档
[XML] 纯文本查看 复制代码
<delete>
    <id>8</id>
</delete>
<commit/>

[XML] 纯文本查看 复制代码
<delete>
    <query>product_catalog_name:幽默杂货</query>
</delete>
<commit/>

[XML] 纯文本查看 复制代码
<delete>
    <query>*:*</query>
</delete>
<commit/>

7.查询索引A.使用SolrJ管理索引库B.添加索引
[Java] 纯文本查看 复制代码
public void addDocument() throws Exception {
    "和solr服务器创建连接"
    "参数:solr服务器的地址"
    SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");
    "创建一个文档对象"
    SolrInputDocument document = new SolrInputDocument();
    "向文档中添加域"
    "第一个参数:域的名称,域的名称必须是在schema.xml中定义的"
    "第二个参数:域的值"
    document.addField("id", "c0001");
    document.addField("title_ik", "使用solrJ添加的文档");
    document.addField("content_ik", "文档的内容");
    document.addField("product_name", "商品名称");
    "把document对象添加到索引库中"
    solrServer.add(document);
    "提交修改"
    solrServer.commit();
}

C.删除文档(根据id删除)
[Java] 纯文本查看 复制代码
public void deleteDocumentByid() throws Exception {
    "创建连接"
    SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");
    "根据id删除文档"
    solrServer.deleteById("c0001");
    "提交修改"
    solrServer.commit();
}


D.根据查询删除
[Java] 纯文本查看 复制代码
public void deleteDocumentByQuery() throws Exception {
    SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");
    solrServer.deleteByQuery("*:*");
    solrServer.commit();
}


E.修改文档8.查询文档A.简单查询
[Java] 纯文本查看 复制代码
public void queryIndex() throws Exception {
    //创建连接
    SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");
    SolrQuery query = new SolrQuery();
    query.setQuery("*:*");
    QueryResponse queryResponse = solrServer.query(query);
    SolrDocumentList solrDocumentList = queryResponse.getResults();
    System.out.println("共查询到商品数量:" + solrDocumentList.getNumFound());
    for (SolrDocument solrDocument : solrDocumentList) {
        System.out.println(solrDocument.get("id"));
        System.out.println(solrDocument.get("product_name"));
        System.out.println(solrDocument.get("product_price"));
        System.out.println(solrDocument.get("product_catalog_name"));
        System.out.println(solrDocument.get("product_picture"));
    }
}

B.复杂查询
[Java] 纯文本查看 复制代码
public void queryIndex2() throws Exception {
    //创建连接
    SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr");
    //创建一个query对象
    SolrQuery query = new SolrQuery();
    //设置查询条件
    query.setQuery("钻石");
    //过滤条件
    query.setFilterQueries("product_catalog_name:幽默杂货");
    //排序条件
    query.setSort("product_price", ORDER.asc);
    //分页处理
    query.setStart(0);
    query.setRows(10);
    //结果中域的列表
    query.setFields("id","product_name","product_price","product_catalog_name","product_picture");
    //设置默认搜索域
    query.set("df", "product_keywords");
    //高亮显示
    query.setHighlight(true);
    //高亮显示的域
    query.addHighlightField("product_name");
    //高亮显示的前缀
    query.setHighlightSimplePre("<em>");
    //高亮显示的后缀
    query.setHighlightSimplePost("</em>");
    //执行查询
    QueryResponse queryResponse = solrServer.query(query);
    //取查询结果
    SolrDocumentList solrDocumentList = queryResponse.getResults();
    System.out.println("共查询到商品数量:" + solrDocumentList.getNumFound());
    for (SolrDocument solrDocument : solrDocumentList) {
        System.out.println(solrDocument.get("id"));
        "取高亮显示"
        String productName = "";
        Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
        List<String> list = highlighting.get(solrDocument.get("id")).get("product_name");
        "判断是否有高亮内容"
        if (null != list) {
            productName = list.get(0);
        } else {
            productName = (String) solrDocument.get("product_name");
        }
        System.out.println(productName);
        System.out.println(solrDocument.get("product_price"));
        System.out.println(solrDocument.get("product_catalog_name"));
        System.out.println(solrDocument.get("product_picture"));
    }
}

9.案例实现(JD商城)
[XML] 纯文本查看 复制代码
"springmvc.xml"
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
        
    <context:component-scan base-package="com.itheima.jd"/>
    <!-- 配置注解驱动,如果配置此标签可以不用配置处理器映射器和适配器 -->
    <mvc:annotation-driven/>
    <!-- 配置视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>
    <!-- SolrServer的配置 -->
    <bean id="httpSolrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer">
        <constructor-arg index="0" value="http://localhost:8080/solr"/>
    </bean>
</beans>


[XML] 纯文本查看 复制代码
"web.xml"
<servlet>
    <servlet-name>springmvc</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <!--
            指定springmvc配置文件的路径
            如果不指定默认为:/WEB-INF/${servlet-name}-servlet.xml
        -->
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:springmvc.xml</param-value>
    </init-param>
</servlet>
<servlet-mapping>
    <servlet-name>springmvc</servlet-name>
    <url-pattern>*.action</url-pattern>
</servlet-mapping>
<!-- 解决post乱码问题 -->
<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
    <init-param>
        <param-name>encoding</param-name>
        <param-value>utf-8</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

























欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2