ElasticSearch实战(五) Term、Range和Bool查询

接下来处理精确查询的功能部分。

ElasticSearch实战(五) Term、Range和Bool查询_第1张图片

如果使用上一章节的模糊查询来搜索John Smith,可以发现包含Smith的两个作者都会匹配到。这里既然是做精确查询,是假定只有John Smith会被匹配,而不会命中Jane Smith,这就要用到Term Query。

下面的开始日期和结束日期、点赞数范围分别是对日期类型和整数类型的范围搜索,这里可以用Range Query。

最后,当同时输入多个条件时,还需要用Bool查询把多个条件组合在一起。

因为条件比较多,首先编写一个Java Bean用来传递参数。

public class SearchForm {

    private int type;
    private String keyword;
    private String author;
    private String startDate;
    private String endDate;
    private String minLikes;
    private String maxLikes;

用type=0表示使用了模糊查询,type=1表示使用了精确查询。controller代码修改如下:

    @RequestMapping("/blogs")
    public String query(Model model, SearchForm searchForm, Integer pageNum, Integer pageSize) {

        if(pageNum == null || pageNum <= 0)
            pageNum = 1;
        if(pageSize == null || pageSize <= 0)
            pageSize = 5;

        SearchQuery searchQuery = null;
        if(searchForm.getType() == 0) {
            //略
        } else {
            BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery();
            if(StringUtils.isNotBlank(searchForm.getAuthor())) {
                queryBuilder.must(QueryBuilders.termQuery("author.keyword", searchForm.getAuthor()));
            }
            if(StringUtils.isNotBlank(searchForm.getStartDate()) || StringUtils.isNotBlank(searchForm.getEndDate())) {
                RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("date");
                if(StringUtils.isNotBlank(searchForm.getStartDate())) {
                    rangeQueryBuilder = rangeQueryBuilder.gte(parseDate(searchForm.getStartDate()).getTime());
                }
                if(StringUtils.isNotBlank(searchForm.getEndDate())) {
                    rangeQueryBuilder = rangeQueryBuilder.lte(parseDate(searchForm.getEndDate()).getTime());
                }
                queryBuilder.must(rangeQueryBuilder);
            }
            if(StringUtils.isNotBlank(searchForm.getMinLikes()) || StringUtils.isNotBlank(searchForm.getMaxLikes())) {
                RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("likes");
                if(StringUtils.isNotBlank(searchForm.getMinLikes())) {
                    int minLikes = NumberUtils.toInt(searchForm.getMinLikes());
                    rangeQueryBuilder = rangeQueryBuilder.gte(minLikes);
                }
                if(StringUtils.isNotBlank(searchForm.getMaxLikes())) {
                    int maxLikes = NumberUtils.toInt(searchForm.getMaxLikes());
                    rangeQueryBuilder = rangeQueryBuilder.lte(maxLikes);
                }
                queryBuilder.must(rangeQueryBuilder);
            }
            searchQuery = new NativeSearchQueryBuilder()
                    .withPageable(new QPageRequest(pageNum - 1, pageSize))
                    .withQuery(queryBuilder)
                    .withSort(SortBuilders.fieldSort("date").order(SortOrder.DESC))
                    .build();
        }

        Page blogs = elasticsearchTemplate.queryForPage(searchQuery, Blog.class, new HighlightResultMapper());
        model.addAttribute("blogs", blogs.getContent());
        model.addAttribute("pageHelper", new PageHelper<>(blogs, pageNum, pageSize));
        model.addAttribute("searchForm", searchForm);
        return "index";
    }

页面上增加精确查询按钮的点击事件及其他适配searchForm的调整。

        $('#boolQuery').click(function () {
            $('#type').val(1);
            $('#searchForm').submit();
        });
  • 修改文档

页面上最后一个功能是点赞,点赞数+1需要修改文档,代码如下:

    @RequestMapping("/like")
    @ResponseBody
    public String like(int id) {
        GetQuery getQuery = new GetQuery();
        getQuery.setId(String.valueOf(id));
        Blog blog = elasticsearchTemplate.queryForObject(getQuery, Blog.class);
        blog.setLikes(blog.getLikes() + 1);

        IndexQuery indexQuery = new IndexQueryBuilder().withId(String.valueOf(blog.getId())).withObject(blog).build();
        elasticsearchTemplate.index(indexQuery);
        return "OK";
    }

页面代码:

    function like(id) {
        $.ajax({url:"/like?id=" + id,async:false});
        var likes = $('#likes' + id).html();
        likes++;
        $('#likes' + id).html(likes);
    }

 

源码

 链接:https://pan.baidu.com/s/1NId5NTmmc1D99n_HgzF6BA 
提取码:vwax

 

你可能感兴趣的:(Elasticsearch)