solr基本配置与sorlJ基本使用

solr基本配置与sorlJ基本使用(单机)

引用别人文章(写的比我好):https://blog.csdn.net/u010510107/article/details/81051795

1.下载安装jdk, tomcat (略)

2.下载solr包

1.下载地址 : http://archive.apache.org/dist/lucene/solr/ 本文使用 solr-7.7.0 版
2.下载到 /usr/local/solr 下
3.解压 : tar zxvf solr-7.7.0.tgz -C /usr/local/solr
4.复制 /usr/local/solr/solr-7.7.0/server/solr-webapp/webapp 到 /usr/local/solr/apache-tomcat-8.5.24/webapps下重命名为 solr
命令:cp -r /usr/local/solr/solr-7.7.0/server/solr-webapp/webapp /usr/local/solr/apache-tomcat-8.5.24/webapps/solr
5.复制 /usr/local/solr/solr-7.7.0/server/lib/ext 下所有包 和 /usr/local/solr/solr-7.7.0/server/lib中 metrics-* 开头五个包
到 /usr/local/solr/apache-tomcat-8.5.24/webapps/solr/WEB-INF/lib 下
在这里插入图片描述
6.在/usr/local/solr/apache-tomcat-8.5.24/webapps/solr/WEB-INF下面创建classes文件夹,并且复制 /usr/local/solr/solr-7.7.0/server/resources下的“log4j.properties”到新创建的这个classes中, 7.7.0版没有此日志文件,因此复制 log4j2.xml

7.需要定义一个solrhome的文件夹,当然名字也可以自拟,位置的话(/usr/local/)个人喜欢直接放tomcat下,然后将/usr/local/solr/solr-7.7.0/server/solr下面的所有配置文件内容复制到新创建的solrhome文件夹中

8.修改/usr/local/solr/apache-tomcat-8.5.24\webapps\solr\WEB-INF\下的web.xml 将以下注释打开或者直接复制这段配置然后修改一下路solrhome的路径

<env-entry>
      <env-entry-name>solr/home</env-entry-name>
      <env-entry-value>/usr/local/solrhome</env-entry-value>
      <env-entry-type>java.lang.String</env-entry-type>
</env-entry>

9.然后保存后启动tomcat 默认访问路径:localhost:8080/solr/index.html
:如果访问出现403的情况那么就试试将刚才进行修改的web.xml文件中的下图内容注释掉,一般在最后的位置,如下:
在这里插入图片描述10.成功界面
在这里插入图片描述

中文分词解析,ik分词器包下载

相关连接: https://search.maven.org/search?q=g:com.github.magese AND a:ik-analyzer&core=gav
1.打开已经解压的ik分词器文件夹
复制jar包到apache-tomcat-8.5.24\webapps\solr\WEB-INF\lib下 :
相关连接 https://blog.csdn.net/guyan0319/article/details/81188977
2.创建solr实例
(1)方式一 : mkdir /usr/local/solr/solrhome/ik
复制配置文件 cp -r /usr/local/solr/solrhome/configsets/_default/conf /usr/local/solr/solrhome/ik/

(2)方式二:
在这里插入图片描述
3.然后到/usr/local/solr/solrhome/ik/conf目录中打开managed-schema文件,增加如下代码:

<!-- ik分词器 -->
<fieldType name="text_ik" class="solr.TextField">
  <analyzer type="index">
      <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false" conf="ik.conf"/>
      <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
  <analyzer type="query">
      <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="true" conf="ik.conf"/>
      <filter class="solr.LowerCaseFilterFactory"/>
  </analyzer>
</fieldType>

使用tomcat方式访问solr,重启tomcat 即可, 如果是solr自启动(bin/solr restart -force) localhost:8983/solr/index.html

使用text_ik分析中文:
在这里插入图片描述

solr基本增删改使用

xml格式添加索引 :

<add>
  <doc>
    <field name="gameId">05991</field>
    <field name="gameName" update="add">angrybird</field>
    <field name="skills" update="add">fly</field>
    <field name="skills" update="add">dump</field>
  </doc>
</add>

在这里插入图片描述
json格式添加索引:{"jsonId":"9527","jsonName":"ok168"}
在这里插入图片描述
查询索引: 相关语法 https://www.jianshu.com/p/e25f8bcfc694
q 查询全部 : *:*
模糊查: id:*111*
hl 设置高亮:

在这里插入图片描述
删除索引:

<delete>
 <query> jsonId:"9527"</query>
</delete>
<delete><id>110</id></delete>
<commit/> 

配置solrJ代码操作solr索引

maven pom:

<!--solr 全文检索 客户端-->
 <dependency>
       <groupId>org.apache.solr</groupId>
        <artifactId>solr-solrj</artifactId>
        <version>4.10.3</version>
</dependency>

springboot方式配置solr:

@Configuration
public class SolrConfig {

    private static final String solrServerUrl = "http://192.168.10.40:8080/solr/ik";

    @Bean
    public HttpSolrServer solrServer(){
        HttpSolrServer solrServer= new HttpSolrServer(solrServerUrl);
        solrServer.setParser(new XMLResponseParser());
        solrServer.setMaxRetries(1);
        solrServer.setConnectionTimeout(500);
        return solrServer;
    }
}

bean方式添加索引dto

public class SolrDto {

    @Field
    private Long id;

    @Field("userName")
    private String userName;

    @Field
    private String userPhone;

    @Field
    private String userAddress;

    private String userDesc;

    //  <field name="id" type="int" indexed="true" stored="true" multiValued="false" required="true"/>
    @Field
    private Set<Integer> testMutiValued; //测试 MutiValued 字段


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserPhone() {
        return userPhone;
    }

    public void setUserPhone(String userPhone) {
        this.userPhone = userPhone;
    }

    public String getUserAddress() {
        return userAddress;
    }

    public void setUserAddress(String userAddress) {
        this.userAddress = userAddress;
    }

    public String getUserDesc() {
        return userDesc;
    }

    public void setUserDesc(String userDesc) {
        this.userDesc = userDesc;
    }

    public Set<Integer> getTestMutiValued() {
        return testMutiValued;
    }

    public void setTestMutiValued(Set<Integer> testMutiValued) {
        this.testMutiValued = testMutiValued;
    }
}
@Controller
public class SolrController extends BaseController {

    @Autowired
    @Qualifier("solrServer")
    private HttpSolrServer solrServer;

    @Autowired
    private IUserService userService;

    /**
     * 数据导入(添加)
     * @return
     */
    @RequestMapping("/solr/dataImport")
    @ResponseBody
    public ResponseData solrDataImport() throws IOException, SolrServerException {
        //查询数据库的用户列表
        List<User> users = userService.select(new User(), 1, Integer.MAX_VALUE);
        if(!CollectionUtils.isEmpty(users)){
            SolrDto dto = new SolrDto();
            dto.setId(1L);
            dto.setUserName("test");
            dto.setUserPhone("123");
            dto.setUserAddress("shanghai");

            Set<Integer> set = Sets.newHashSet(1,2,3);
            dto.setTestMutiValued(set);
            //bean方式
            solrServer.addBean(dto);

            //单个属性方式
            for (User user : users) {
                //创建文档对象
                SolrInputDocument document = new SolrInputDocument();
                document.addField("userName", user.getUserName());
                document.addField("id", user.getUserId());
                document.addField("userPhone", user.getPhone());
                document.addField("userAddress", user.getAddress());
                document.addField("userDesc", user.getDescription());

                //文档对象写入索引库
                solrServer.add(document);
            }

            //提交
            solrServer.commit();
        }
        System.out.println("solrDataImport 导入成功!");
        return new ResponseData();
    }



    @RequestMapping("/solr/dataQuery")
    public void queryDocument() throws SolrServerException, IOException{
        String keywords = "CH000";

        //创建一个查询对象
        SolrQuery query = new SolrQuery();
        //设置查询条件
        //query.setQuery("*:*");
        query.setQuery("userName:*"+keywords+"*");
        //是否需要高亮
        boolean isHighlighting = !StringUtils.equals("*", keywords) && StringUtils.isNotEmpty(keywords);

        if (isHighlighting) {
            // 设置高亮
            query.setHighlight(true); // 开启高亮组件
            query.addHighlightField("userName");// 高亮字段
            query.setHighlightSimplePre("<em>");// 标记,高亮关键字前缀
            query.setHighlightSimplePost("</em>");// 后缀
        }

        query.setStart(0);   //开始页
        query.setRows(6);    //显示行数
        query.setSort("id", SolrQuery.ORDER.desc);  //排序
        query.setFields("id","userName","userPhone","userAddress"); //显示的字段
        //query.addField();

        //执行查询
        QueryResponse response = solrServer.query(query);
        //取查询结果
        SolrDocumentList solrDocumentList = response.getResults();  //获取对象列表
        System.out.println("共查询到记录:" + solrDocumentList.getNumFound());
        for (SolrDocument solrDocument : solrDocumentList) {
            System.out.println(solrDocument.get("id"));   //获取指定属性
            System.out.println(solrDocument.get("userName"));
            System.out.println(solrDocument.get("userPhone"));
            System.out.println(solrDocument.get("userAddress"));
            System.out.println("--------------------------");
        }

        System.out.println("queryDocument 查询成功!");
    }

    /**
     * 更新索引
     */
    @RequestMapping("/solr/dataUpdate")
    public void updateDocument() throws SolrServerException, IOException{
        SolrInputDocument doc = new SolrInputDocument();

        Long id = 10001L;
        doc.addField("id", id);
        doc.addField("userDesc", "描述");

        UpdateResponse rsp = solrServer.add(doc);
        System.out.println("update doc id:" + id + " result:" + rsp.getStatus() + " Qtime:" + rsp.getQTime());
        UpdateResponse rspCommit = solrServer.commit();
        System.out.println("commit doc to index" + " result:" + rspCommit.getStatus() + " Qtime:" + rspCommit.getQTime());
    }



    /**
     * 删除有多种操作方式,可以通过id,id List,甚至query语句
     * @throws SolrServerException
     * @throws IOException
     */
    @RequestMapping("/solr/dataDelete")
    public void deleteDocument() throws SolrServerException, IOException{
        solrServer.deleteById("1");   //通过id删除
        //solrServer.deleteByQuery("*:*");  //通过语句删除
        solrServer.commit();

        System.out.println("dataDelete 删除成功!");
    }

}

首个文档,不足之处请多包涵

猜你喜欢

转载自blog.csdn.net/weixin_44203995/article/details/89309227