Solr--分词与搜索

1 .1在managed-schema文件夹中添加分词器。
现在Solr已经更新到了6.6,网上很多分词器出现不兼容的情况,在网站找到了半天的解决方案。看到一位大神,找到原因后更改源码,重新打包,放在/webapps/solr/WEB-INF/lib/ 下,感谢博主写了大段的文章阐述原因及代码分析。
附上大神博客:http://www.cnblogs.com/immortal-ghost/p/6954360.html

 
       <fieldType name="IK_cnAnalyzer" class="solr.TextField" positionIncrementGap="100">
              <analyzer type="index">
             <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false"/>
             analyzer>
              <analyzer type="query">
                    <tokenizer class="org.wltea.analyzer.lucene.IKTokenizerFactory" useSmart="false"/>
                analyzer>
        fieldType>

如下的分词效果:
Solr--分词与搜索_第1张图片
1.2 字段:

<field name="user_id" type="string" indexed="true" stored="true"/>
<field name="user_name" type="IK_cnAnalyzer" indexed="true" stored="true"/>
<field name="user_password" type="string" indexed="true" stored="true"/>

<field name="item_keyword" type="IK_cnAnalyzer" indexed="true" stored="true" multiValued="true"/>
<copyField source="user_name" dest="item_keyword"/>

1.3 整合到Spring。
solr-solrj为5.5,有的版本可能不一样,会出现不支持的情况。

<bean id="solrClient" class="org.apache.solr.client.solrj.impl.HttpSolrClient">
        <constructor-arg index="0" value="http://192.168.209.131:8080/solr/mycore"/>
    bean>

需要说明的是,注入的URL,应该是IP+端口号+solr运行在Tomcat中的项目名+数据仓库名称,Solr管理页面为:
http://192.168.209.131:8080/solr/index.html有点区别。
自动注入到需要使用的位置。

2 做的一个简单的搜索。
搜索Dao层,处理各种情况的搜索。

@Autowired
    private SolrClient solrClient;

    /**
     * 搜索
     */
    public List search(SolrQuery solrQuery) {
        // TODO Auto-generated method stub
        List lstUser=new ArrayList();

        try {
            QueryResponse queryResponse=solrClient.query(solrQuery);
            SolrDocumentList documentList=queryResponse.getResults();

            System.out.println(documentList.getNumFound());//取查询结果总数量

            //高亮部分单独分开了。
            Map>> highlighting=queryResponse.getHighlighting();//高亮部分

            for (SolrDocument solrDocument : documentList) {

                User user=new User();
                System.out.println(solrDocument.get("user_id"));

                user.setId(Integer.parseInt(solrDocument.get("user_id").toString()));

                //取高亮部分,
                List lstHigh=highlighting.get(solrDocument.get("id")).get("user_name");
                String name="";
                if(lstHigh!=null && lstHigh.size()>0){
                    name=lstHigh.get(0);
                }else{
                    //无高亮
                    name=(String)solrDocument.get("user_name");
                }
                user.setName(name);

                user.setPassword((String)solrDocument.get("user_password"));
                lstUser.add(user);
            }
        } catch (SolrServerException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return lstUser;
    }

调用处:

/**
     * 搜索
     * @param queryString
     * @return
     */
    public List search(String queryString) {
        // TODO Auto-generated method stub
        SolrQuery solrQuery = new SolrQuery();

        solrQuery.setQuery(queryString);
        //solrQuery.setQuery("*:*");

        solrQuery.setHighlight(true);
        solrQuery.addHighlightField("user_name");// 设置高亮字段
        solrQuery.setHighlightSimplePre("");
        solrQuery.setHighlightSimplePost("");

        //solrQuery.set("", "");
        solrQuery.set("df", "item_keyword");// 设置默认
        return searchService.search(solrQuery);
    }

Controller:

@Autowired
    private UserService userService;

    @RequestMapping(value="/query",method=RequestMethod.GET)
    @ResponseBody
    public void search(HttpServletRequest request,
            HttpServletResponse response, String queryString,
            @RequestParam(defaultValue = "15") Integer rows,
            @RequestParam(defaultValue = "1") Integer page) throws IOException {

        List lstUser=userService.search(queryString);
        JSONArray jsonArray=new JSONArray();
        JSONObject jsonObject=null;
        for (User user : lstUser) {
            jsonObject=new JSONObject();
            jsonObject.put("id",user.getId());
            jsonObject.put("name", user.getName());
            jsonObject.put("password", user.getPassword());
            jsonArray.add(jsonObject);
        }
        response.setContentType("text/html;charset=utf-8");
        response.getWriter().print(jsonArray);
    }

附出现的问题:
1 在配置了分词后,在分词界面中能成功的分词,但是在进行查询的时候却啥都不能查出来,就连全匹配都查不出来,各种查资料,差点都准备放弃这块的,突然发现数据是之前就已经存在了的,重新配置的字段类型配置的分词器是在数据导入后添加的。重新构建一下索引试试,果然,重构索引后能成功登顶分词并能查询出来。

你可能感兴趣的:(Solr--分词与搜索)