[ElasticSearch]Term精确匹配中文字符串短语

原创 2016年07月06日 20:46:38

1. 给定数据

curl -XPUT 'localhost:9200/test-index/stu/1' -d'
{
    "name":"陈泽鹏",
    "sex":"boy",
    "college":"计算机学院"
}';
curl -XPUT 'localhost:9200/test-index/stu/2' -d'
{
    "name":"廖力生",
    "sex":"boy",
    "college":"通信学院"
}';
curl -XPUT 'localhost:9200/test-index/stu/3' -d'
{
    "name":"李源一",
    "sex":"girl",
    "college":"计算机学院"
}';
curl -XPUT 'localhost:9200/test-index/stu/4' -d'
{
    "name":"陈哲超",
    "sex":"girl",
    "college":"计算机学院"
}';
curl -XPUT 'localhost:9200/test-index/stu/5' -d'
{
    "name":"AA",
    "sex":"girl",
    "college":"计算机学院"
}';
curl -XPUT 'localhost:9200/test-index/stu/6' -d'
{
    "name":"bb",
    "sex":"girll",
    "college":"通信学院"
}';
curl -XPUT 'localhost:9200/test-index/stu/7' -d'
{
    "name":"方镜淇",
    "sex":"boy",
    "college":"电子工程学院"
}';
curl -XPUT 'localhost:9200/test-index/stu/8' -d'
{
    "name":"吴兴涵",
    "sex":"boy",
    "college":"计算机学院"
}';

2. 需求

我们想精确匹配出来自计算机学院的学生,所以我们就实现如下语句:

/**
     * query之Term Query
     *
     * @param client
     * @param index
     * @param type
     */
    public static void termQuery(Client client, String index, String type) {
        // Query
        QueryBuilder queryBuilder = QueryBuilders.termQuery("college", "计算机学院");
        // Search
        SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index);
        searchRequestBuilder.setTypes(type);
        searchRequestBuilder.setQuery(queryBuilder);
        // 执行
        SearchResponse searchResponse = searchRequestBuilder.execute().actionGet();
        // 结果
        queryResult(searchResponse);
    }

    /**
     * 返回查询结果
     *
     * @param searchResponse
     */
    public static void queryResult(SearchResponse searchResponse) {
        // 结果
        SearchHit[] searchHits = searchResponse.getHits().getHits();
        logger.info("----------termMatch size {}", searchHits.length);
        for (SearchHit searchHit : searchHits) {
            logger.info("----------hit source: id {} source{}", searchHit.getId(),
                    searchHit.getSource());
        } // for
    }

返回结果:

20:30:46.815 [main] INFO  com.sjf.open.api.TermLevelQuery - ----------termMatch size 0
表示没有找到来自计算机学院的同学,这咋可能。。。。
  1. 解决方案一

把计算机学院拆分成多个汉字,再利用bool查询查找:

/**
     * query之中文短语查询
     *
     * @param client
     * @param index
     * @param type
     */
    public static void termPhraseQuery(Client client, String index, String type) {
        // Query
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
        boolQueryBuilder.must(QueryBuilders.termQuery("college", "计"));
        boolQueryBuilder.must(QueryBuilders.termQuery("college", "算"));
        boolQueryBuilder.must(QueryBuilders.termQuery("college", "机"));
        boolQueryBuilder.must(QueryBuilders.termQuery("college", "学"));
        boolQueryBuilder.must(QueryBuilders.termQuery("college", "院"));
        // Search
        SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index);
        searchRequestBuilder.setTypes(type);
        searchRequestBuilder.setQuery(boolQueryBuilder);
        // 执行
        SearchResponse searchResponse = searchRequestBuilder.execute().actionGet();
        // 结果
        queryResult(searchResponse);
    }

返回结果:

20:34:53.022 [main] INFO  com.sjf.open.api.Search - ----------hit source: id 5 source {college=计算机学院, sex=girll, name=AA}
20:34:53.028 [main] INFO  com.sjf.open.api.Search - ----------hit source: id 8 source {college=计算机学院, sex=boy, name=吴兴涵}
20:34:53.029 [main] INFO  com.sjf.open.api.Search - ----------hit source: id 1 source {college=计算机学院, sex=boy, name=陈泽鹏}
20:34:53.029 [main] INFO  com.sjf.open.api.Search - ----------hit source: id 7 source {college=计算机学院, sex=boy, name=陈哲超}
20:34:53.029 [main] INFO  com.sjf.open.api.Search - ----------hit source: id 3 source {college=计算机学院, sex=girll, name=李源一}

4. 解决方案二

设置字段属性,设置为not_analyzed,再插入上面数据:

curl -XPUT 'localhost:9200/test-index' -d'
{
    "mappings":{
            "stu":{
                     "properties":{
                                    "name":{
                                               "type":"string"
                                    },
                                    "sex":{
                                             "type":"string"
                                    },
                                    "college":{
                                                "type":"string",
                                                "index":"not_analyzed"
                                    }
                     }
            }
    }
}';

具体分析:https://www.elastic.co/guide/en/elasticsearch/reference/2.3/query-dsl-term-query.html

/**
     * query之Term Query
     *
     * @param client
     * @param index
     * @param type
     */
    public static void termQuery(Client client, String index, String type) {
        // Query
        QueryBuilder queryBuilder = QueryBuilders.termQuery("college", "计算机学院");
        // Search
        SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index);
        searchRequestBuilder.setTypes(type);
        searchRequestBuilder.setQuery(queryBuilder);
        // 执行
        SearchResponse searchResponse = searchRequestBuilder.execute().actionGet();
        // 结果
        queryResult(searchResponse);
    }

输出结果:

20:34:53.022 [main] INFO  com.sjf.open.api.Search - ----------hit source: id 5 source {college=计算机学院, sex=girll, name=AA}
20:34:53.028 [main] INFO  com.sjf.open.api.Search - ----------hit source: id 8 source {college=计算机学院, sex=boy, name=吴兴涵}
20:34:53.029 [main] INFO  com.sjf.open.api.Search - ----------hit source: id 1 source {college=计算机学院, sex=boy, name=陈泽鹏}
20:34:53.029 [main] INFO  com.sjf.open.api.Search - ----------hit source: id 7 source {college=计算机学院, sex=boy, name=陈哲超}
20:34:53.029 [main] INFO  com.sjf.open.api.Search - ----------hit source: id 3 source {college=计算机学院, sex=girll, name=李源一}


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Elasticsearch:在搜索引擎中如何实现完全匹配(内容精确匹配)查询

本文地址: 在有搜索引擎之前,我们查文档常使用顺序匹配。比如要搜索 "我的祖国是花园",需要在文档中顺序扫描,找到完全匹配的子句。 在有了搜索引擎后,我们对查询语句做的处理就不一样了。我们通常会先...

Elasticsearch - 短语匹配(match_phrase)以及slop参数

短语匹配(Phrase Matching)就像用于全文搜索的的match查询一样,当你希望寻找邻近的单词时,match_phrase查询可以帮你达到目的。GET /my_index/my_type/_...

关于全文搜索elasticsearch中matchQuery和termQuery的区别

如题,本文主要讲关于全文搜索elasticsearch中matchQuery和termQuery的区别,附带一点其它查询用法。 准备工作,下载相关jar包,本文所有jar包列表: apache-l...
  • yunsyz
  • yunsyz
  • 2016-07-22 18:10
  • 10674

elasticsearch笔记_近似匹配_部分匹配(七)

短语匹配 一个被认定为和短语 quick brown fox 匹配的文档,必须满足以下这些要求: quick 、 brown 和 fox 需要全部出现在域中。 brown 的位...

Elasticsearch笔记-过滤查询

承接上篇文章Elasticsearch笔记-深入查询,本篇文章继续了解ES查询的部分。主要涉及查询结果的过滤及聚合查询部分。 ES中的查询操作分为2种:查询(query)和过滤(filter)。查询即...

[Elasticsearch] 部分匹配 (二) - 通配符及正则表达式查询

通配符和正则表达式查询 wildcard查询和prefix查询类似,也是一个基于词条的低级别查询。但是它能够让你指定一个模式(Pattern),而不是一个前缀(Prefix)。它使用标准的s...

[Elasticsearch] 部分匹配 (一) - 前缀查询

部分匹配(Partial Matching) 敏锐的读者可能已经发现到目前为止,介绍的查询都是在整个词条层面进行操作的。匹配的最小单元必须是一个词条。你只能找到存在于倒排索引(Inverted ...

UVa 644 Immediate Decodability (前缀匹配)

644 - Immediate Decodability Time limit: 3.000 seconds http://uva.onlinejudge.org/index.php?option...

elasticsearch搜索关键词详解

近期由于工作需要,详细了解了es搜索关键词的具体含意,其实质还是lucene的搜索关键词的释意。下详述之。   首先强调下term概念,当某个字段进行分词操作后,该字段对应的任意串至少会被分为多个t...

Elasticsearch查询规则(一)match和term

转载自:http://www.cnblogs.com/muniaofeiyu/p/5616316.html es种有两种查询模式,一种是像传递URL参数一样去传递查询语句,被称为简单搜索或查询字符串...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)