十八、Elasticsearch进行phrase matchin

作者: 编程界的小学生 | 来源:发表于2017-07-16 16:45 被阅读85次

    1、match query

    {
        "match": {
            "content": "java spark"
        }
    }
    

    match query:只能搜索到包含java和spark的document,但是不知道java和spark是不是离的很近或者紧挨着构成了短语。

    match query会将包含java或包含spark或包含java spark短语的document都会返回回来。

    2、需求

    需求:
    (1)java spark:就靠在一起,中间不能插入任何其他字符,就要搜索出来这种短语的document
    (2)java spark:但是要求,java和spark两个单词靠的越近,doc的分数越高,排名越靠前。

    这两个需求用match query是肯定做不到的。

    需求1可以用phrase match或proximity match(近似匹配)。而需求2必须用proximity match来实现。

    今天讲解的是phrase match

    3、phrase matching

    (1)数据准备

    POST /forum/article/5/_update
    {
      "doc": {
        "content": "spark is best big data solution based on scala ,an programming language similar to java spark"
      }
    }
    

    (2)搜索

    GET /forum/article/_search
    {
      "query": {
        "match_phrase": {
          "content": "java spark"
        }
      }
    }
    

    结果:

    {
      "took": 10,
      "timed_out": false,
      "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
      },
      "hits": {
        "total": 1,
        "max_score": 0.5753642,
        "hits": [
          {
            "_index": "forum",
            "_type": "article",
            "_id": "5",
            "_score": 0.5753642,
            "_source": {
              "articleID": "DHJK-B-1395-#Ky5",
              "userID": 3,
              "hidden": false,
              "postDate": "2017-03-01",
              "tag": [
                "elasticsearch"
              ],
              "tag_cnt": 1,
              "view_cnt": 10,
              "title": "this is spark blog",
              "content": "spark is best big data solution based on scala ,an programming language similar to java spark",
              "sub_title": "haha, hello world",
              "author_first_name": "Tonny",
              "author_last_name": "Peter Smith",
              "new_author_last_name": "Peter Smith",
              "new_author_first_name": "Tonny"
            }
          }
        ]
      }
    }
    

    只返回了只有包含java spark这个短语的document返回了。

    4、term position

    比如:
    doc1:hello world,java spark
    doc2:spark java

    term position对应关系如下:

    term:单词,词项,关键字
    position:词项在doc中出现的位置

    term position
    hello doc1(0)
    world doc1(1)
    java doc1(2) doc2(2)
    spark doc1(3) doc2(1)

    我们也可以根据GET _analyze命令去查看position是否正确

    GET _analyze
    {
      "text": "hello world, java spark",
      "analyzer": "standard"
    }
    

    结果

    {
      "tokens": [
        {
          "token": "hello",
          "start_offset": 0,
          "end_offset": 5,
          "type": "<ALPHANUM>",
          "position": 0
        },
        {
          "token": "world",
          "start_offset": 6,
          "end_offset": 11,
          "type": "<ALPHANUM>",
          "position": 1
        },
        {
          "token": "java",
          "start_offset": 13,
          "end_offset": 17,
          "type": "<ALPHANUM>",
          "position": 2
        },
        {
          "token": "spark",
          "start_offset": 18,
          "end_offset": 23,
          "type": "<ALPHANUM>",
          "position": 3
        }
      ]
    }
    

    5、match_phrase的基本原理
    上面我们刚说了term position

    term position
    hello doc1(0)
    world doc1(1)
    java doc1(2) doc2(2)
    spark doc1(3) doc2(1)

    java doc1(2) doc2(2)
    spark doc1(3) doc2(1)

    要找到每个term都在的一个共有的那些document,就是要求一个doc必须包含每个term,才能拿出来继续计算。

    doc1 --》 java和spark --》 spark position是3,java position是2;3-2=1;恰巧是1,正好挨着。凑成了短语。满足条件。

    doc2 --》 java和spark --》 spark position是1,java position是2,;1-2=-1,凑成了spark java而不是java spark,所以不满足条件。

    6、一定要弄懂这块原理,我说的已经很详细很详细了,因为后面我会写proximity match近似匹配的文章,proximity match和match phrase原理一模一样!!!!

    若有兴趣,欢迎来加入群,【Java初学者学习交流群】:458430385,此群有Java开发人员、UI设计人员和前端工程师。有问必答,共同探讨学习,一起进步!
    欢迎关注我的微信公众号【Java码农社区】,会定时推送各种干货:


    qrcode_for_gh_577b64e73701_258.jpg

    相关文章

      网友评论

        本文标题:十八、Elasticsearch进行phrase matchin

        本文链接:https://www.haomeiwen.com/subject/lnatkxtx.html