17、match_phrase query 短语匹配搜索

  实现两个需求:

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

  要实现上述两个需求,用match做全文检索,是不行的,必须得用proximity match,近似匹配

  phrase match:短语匹配
  proximity match:近似匹配

  match phrase query,就是要去将多个term作为一个短语,一起去搜索,只有包含这个短语的doc才会作为结果返回

  添加数据

POST /forum/_update/5
{   
  "doc":{
     "articleID" : "XHDK-A-1293-#fJ3", 
     "userID" : 1,
     "hidden": false, 
     "postDate": "2017-01-01",
     "content":"spark is best big data solution based on scala ,an programming language similar to java spark"
  }
}

  短语查询

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

  term position

  分词后,每个单词就是一个term,分词后 , es还记录了 每个field的位置。

  举个例子 两个doc 如下:

  hello world, java spark doc1
  hi, spark java doc2

  建立倒排索引后

  

 

   通过如下API来看下

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
    }
  ]
}

  match phrase的原理

  首先 java spark 被拆成 java和spark ,分别取索引中查找

java  出现在    doc1(2)    doc2(2)
spark 出现在  doc1(3)    doc2(1)

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

  doc1 --> java和spark --> spark position恰巧比java大1 --> java的position是2,spark的position是3,恰好满足条件

  doc1符合条件

  doc2 --> java和spark --> java position是2,spark position是1,spark position比java position小1,而不是大1 --> 光是position就不满足,那么doc2不匹配 .

  

  

posted on 2020-11-01 14:34  溪水静幽  阅读(2095)  评论(0)    收藏  举报