elasticsearch match_phrase语句你真的理解了吗?

栏目: IT技术 · 发布时间: 4年前

内容简介:这是我今天对于elasticsearch的一点体会,elasticsearch默认的分词器是standard,就是以空格进行分词,elasticsearch语句和standard分词器结合的比较好,在学习的过程中,测试英文没有问题,但一旦遇到中文或者中文分词,好像就不是那么顺利了,甚至很多参数对中文分词器没有用,所以理解中文分词器看来非常关键,今天我使用match_phrase语句进行简单的总结。match_phrase是短语匹配,是为了更加精准的搜索,在某些场景下非常有用,仔细体会官方文档的介绍:先索引两

这是我今天对于elasticsearch的一点体会,elasticsearch默认的分词器是standard,就是以空格进行分词,elasticsearch语句和standard分词器结合的比较好,在学习的过程中,测试英文没有问题,但一旦遇到中文或者中文分词,好像就不是那么顺利了,甚至很多参数对中文分词器没有用,所以理解中文分词器看来非常关键,今天我使用match_phrase语句进行简单的总结。

match_phrase是短语匹配,是为了更加精准的搜索,在某些场景下非常有用,仔细体会官方文档的介绍:

The match_phrase query analyzes the text and creates a phrase query out of the analyzed text.

standard分词器

先索引两条数据

POST testen/_doc/1
{
  "message": "i like footbool"
}

POST testen/_doc/2
{
  "message": "我们大家好中国人喜欢运动"
}

进行搜索,没毛病,看上去很完美:

GET testen/_search
{
  "query": {
    "match_phrase": {
      "message": {
        "query": "i like"
      }
    }
  }
}

没有出现想要的结果,说明分词的顺序很重要(短语搜索和索引关系很大):

GET testen/_search
{
  "query": {
    "match_phrase": {
      "message": {
        "query": "like i"
      }
    }
  }
}

为了让短语匹配宽松一点,使用slop,没毛病:

GET testen/_search
{
  "query": {
    "match_phrase": {
      "message": {
        "query": "i footbool",
        "slop": 1
      }
    }
  }
}

对中文看上去支持的不错,因为标准分词器将中文分为了一个个字符(缺点反而变为了优点):

GET testen/_search
{
  "query": {
    "match_phrase": {
      "message": {
        "query": "我们大家运动",
        "slop": 6
      }
    }
  }
}

中文分词器

接下去我们看看中文分词,match_phrase是如何处理的:

PUT testcn
{
  "mappings": {
    "properties": {
      "message": {
        "type": "text",
        "analyzer": "hanlp",
        "fields": {
          "keyword": {
            "type": "keyword"
          }
        }
      }
    }
  }
}

先索引没有意义的一个句子:

POST testcn/_doc/1
{
  "message": "我们大家好中国人喜欢运动"
}

看看分词过程:

GET /_analyze
{
  "text":  "我们大家好中国人喜欢运动",
  "analyzer": "hanlp"
}

匹配到了:

GET testcn/_search
{
  "query": {
    "match_phrase": {
      "message": {
      "query": "大家好中国人喜欢",
      "slop": 2
      }
    }
  }
}

这句更简单,居然没有匹配到:

GET testcn/_search
{
  "query": {
    "match_phrase": {
      "message": {
      "query": "中国人喜欢",
      "slop": 2
      }
    }
  }
}

这说明什么?换句 比较通顺 的句子吧:

POST testcn/_doc/2
{
  "message": "今天我去了北京天安门"
}

GET testcn/_search
{
  "query": {
    "match_phrase": {
      "message": {
      "query": "去了天安门",
      "slop": 1
      }
    }
  }
}

GET testcn/_search
{
  "query": {
    "match_phrase": {
      "message": {
      "query": "我天安门",
      "slop": 3
      }
    }
  }
}

结果看上去还行。

所以说,如果要使用短语匹配,用标准分词器是不是支持的也不错?用中文分词器反而不好?


以上所述就是小编给大家介绍的《elasticsearch match_phrase语句你真的理解了吗?》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Java解惑

Java解惑

布洛赫、加夫特 / 陈昊鹏 / 人民邮电出版社 / 2006-1 / 39.00元

本书特写了95个有关Java或其类库的陷阱和缺陷的谜题,其中大多数谜题都采用了短程序的方式,这些程序的行为与其看似的大相径庭。在每个谜题之后都给出了详细的解惑方案,这些解惑方案超越了对程序行为的简单解释,向读者展示了如何一劳永逸地避免底层的陷阱与缺陷。 本书趣味十足、寓教于乐,适合于具备Java知识的学习者和有编程经验的Java程序员。一起来看看 《Java解惑》 这本书的介绍吧!

HTML 编码/解码
HTML 编码/解码

HTML 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具