elasticsearch-mathc和term的区分

news/2024/7/7 12:50:03

elasticsearch和mysql在思想上是有不同的,elasticsearch有分词一说,比如北京奥运分词成北京奥运北京奥运。分词要要考虑两点,一个是查询字符串要不要分词,还有就是原存储字段是不是精确值。

1. match 查询

无论你在任何字段上进行的是全文搜索还是精确查询,match 查询是你可用的标准查询。

`、如果你在一个全文字段上使用 match 查询,在执行查询前,它将用正确的分析器去分析查询字符串:

{ "match": { "tweet": "About Search" }}

2、如果在一个精确值的字段上使用它, 例如数字、日期、布尔或者一个 NOT_ANALYZED 字符串字段,那么它将会精确匹配给定的值:

{ "match": { "age":    26           }}
{ "match": { "date":   "2014-09-01" }}
{ "match": { "public": true         }}
{ "match": { "tag":    "full_text"  }}

match查询会先对搜索词进行分词,分词完毕后再逐个对分词结果进行匹配,因此相比于term的精确搜索,match是分词匹配搜索,match搜索还有两个相似功能的变种,一个是match_phrase,一个是multi_match

2. term 查询

term是代表完全匹配,也就是精确查询,搜索前不会再对搜索词进行分词,所以我们的搜索词必须是文档分词集合中的一个。比如说我们要找标题为北京奥运的所有文档

$curl -XGET http://localhost:9200/index/doc/_search?pretty -d 
'{
  "query":{
    "term":{
        "title":"北京奥运"
    }
  }
}'

将会得到如下结果

{
    "took": 1,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "failed": 0
    },
    "hits": {
    "total": 1,
    "max_score": 0.92055845,
    "hits": [
     {
        "_index": "index",
        "_type": "doc",
        "_id": "3",
        "_score": 0.92055845,
        "_source": {
           "content": "同一个世界同一个梦想",
           "title": "北京奥运",
           "tags": [
               "和平"
            ]
        }
      }
    ]
  }
}

搜索title包含北京或者奥运的,结果也一样,但是如果你搜索词为京奥,或者北京奥这样的,那么搜索结果将为空

{
  "took" : 1,
  "timed_out" : false,
  "_shards" : {
      "total" : 5,
      "successful" : 5,
      "failed" : 0
  },
  "hits" : {
      "total" : 0,
      "max_score" : null,
      "hits" : [ ]
  }
}

3. match_phrase

match_phrase为按短语搜索,match_phrase的搜索方式和match类似,先对搜索词建立索引,并要求所有分词必须在文档中出现(像不像operator为and的match查询),除此之外,还必须满足分词在文档中出现的顺序和搜索词中一致且各搜索词之间必须紧邻,因此match_phrase也可以叫做紧邻搜索。

所以,当我们搜美国留给

curl -XGET http://localhost:9200/index/doc/_search?pretty -d 
'{
  "query": {
    "match_phrase": {
        "content": "美国留给"
    }
  }
}'

以下内容美国留给伊拉克的是个烂摊子吗是可以搜索出来的

    "_source" : {
        "content" : "美国留给伊拉克的是个烂摊子吗",
        "title" : "标题",
        "tags" : [ "美国", "伊拉克", "烂摊子" ]
    }

但是我们搜索留给美国美国伊拉克时,却没有搜索结果,因为第一个顺序不对,第二个不是紧邻(隔着留给)。

紧邻对于匹配度要求较高,为了减小精度增加可操作性,引入了slop参数。该参数可以指定相隔多少个词仍被算作匹配成功。如下,

curl -XGET http://localhost:9200/index/doc/_search?pretty -d 
'{
    "query": {
        "match_phrase": {
            "content": {
                "query": "美国伊拉克",
                "slop": "1"
            }
        }
    }
}'

当我们将slop设置为1时,下面文档是可以搜索到的

  "_source" : {
    "content" : "美国留给伊拉克的是个烂摊子吗",
    "title" : "标题",
    "tags" : [ "美国", "伊拉克", "烂摊子" ]
  }

需要注意的是,当slop的值过大时(超出文档总分词数),那么分词数据将可以是随意的,即跟operator为and的match查询效果一样。比如我们查询

curl -XGET http://localhost:9200/index/doc/_search?pretty -d 
'{
    "query": {
        "match_phrase": {
            "content": {
                "query": "伊拉克美国",
                "slop": "12"
            }
        }
    }
}'

将会得到与上面一样的结果

4. multi_match

如果我们希望两个字段进行匹配,其中一个字段有这个文档就满足的话,使用multi_match

{
  "query": {
    "multi_match": {
        "query" : "我的宝马多少马力",
        "fields" : ["title", "content"]
    }
  }
}

但是multi_match就涉及到匹配评分的问题了。

转载于:https://www.cnblogs.com/redirect/p/10066791.html


http://www.niftyadmin.cn/n/530360.html

相关文章

easyexcel设置下拉选项不能覆盖_Excel2016下拉菜单怎么做?

在 Excel 中,制作一些有选择分类功能的表格时,需要制作下拉菜单,以便于每一行选择和减少输入,那么 Excel下拉菜单怎么做?这主要用公式中的定义名称和数据中的数据验证两项功能,用这两项功能可以制作出一级下…

《马哥出品高薪linux运维教程》wingkeung学习笔记-linux基础入门课程

计算机原理概念: 1、CPU和内存中的存储单元通信线路称为总线(BUS),总线是被指令和数据复用的,所以也称为前端总线。 2、计算机中计算频率的时间标准即晶体振荡器原理,精确计算时间长度,根据相同…

FLASH与XML的数据交互

在FLASH中,使用XML接口获取外部数据是最有效的方法之一.(通常还有WebSerivce接口和LoadVars方法) 下面来看一个简单的XML文档(city.xml) 这个文档描述的是城市地区的信息 xml version"1.0" encoding"gb2312"?> <root> <city name"上海&q…

python mysql数据库编程_python使用mysql数据库

import pymysqlconn pymysql.connect( #Connect() 方法用于创建数据库的连接&#xff0c;里面可以指定参数&#xff1a;用户名&#xff0c;密码&#xff0c;主机等信息host localhost, #这只是连接到了数据库&#xff0c;要想操作数据库需要创建游标port 3306,user root,pa…

三目运算符判断三个值_Day10:Java语言基础-运算符之赋值运算符

大家好&#xff0c;我在这里讲解一下为什么我在课程中大量使用图片来展示我的演示程。是因为虽然编辑文章的时候&#xff0c;有代码块功能可以实现代码的结构展示。但是在手机端的样式兼容做的不够好&#xff0c;我在手机端看了自己的内容&#xff0c;觉得很难看&#xff0c;所…

让Flash更好的利用Xml

英文原文地址&#xff1a; http://www.darronschall.com/weblog/archives/000065.cfm 在网上许多XML的解释数据都涉及到在FLASH不断地从一个XML文档中读取节点树来释放数据。这种做法有两个不足的地方&#xff1a;速度和可读性。下面我将教大家一种不是新的&#xff0c;但是&am…

数组(随机生成一维数组),二维数组的概念和题目设计(利用二维数组 :任意给定分数去计算科目和人均平均分)...

1 //数组间的关系arr[]中的数字为几&#xff0c;[]内就有几个数2 //{ }内的数是从0开始&#xff0c;如需要打印应从0开数3 如{2,6,9,8,7}打印arr[4]就是74 #include <stdio.h>5 #include <stdlib.h>6 int main()7 {8 int arr[] { 1,2,3,4,8};9 10 …

mysql5.6备份脚本_实战:INNOBACKUPEX for mysql 5.6自己主动备份脚本

#backup.sh#!/bin/sh## 第一次运行它的时候它会检查是否有全然备份,否则先创建一个全库备份# 当你再次执行它的时候。它会依据脚本中的设定来基于之前的全库备份进行增量备份#ocpyang126.comINNOBACKUPEX_PATHinnobackupex #INNOBACKUPEX的命令INNOBACKUPEXFULL/usr/bin/$INNO…