Elasticsearch(六)---查询

全文查询

match

match query会对查询语句进行分词,分词后查询语句中的任何一个词项被匹配,文档都会被搜索到。如果想查询匹配所有关键词的文档,可以用and操作符连接。

分词之后匹配的任意一个都可以。因为是or

curl node2:9200/books/_search?pretty -d '{
 "query":{
   "match":{
     "title":{
	   "query":"java编程思想",
	   "operator":"or"
	 }
   }
 }
}'

and操作符

curl node2:9200/books/_search?pretty -d '{
 "query":{
   "match":{
     "title":{
   "query":"java编程思想",
   "operator":"and"
 }
   }
 }
}'
match_phrase

match_phrase查询会把query内容分词,分词器可以自定义,同时文档要满足以下两个条件才会被搜索到:

  • 分词后所有词项都要出现在该字段中
  • 字段中的词项顺序要一致。

java编程思想  title

java  编程  思想  编程思想  java编程

curl -XPUT node2:9200/test/test/1?pretty -d '{
  "foo":"I just said hello world"
}'

curl -XPUT node2:9200/test/test/2?pretty -d '{
  "foo":"Hello world"
}'

curl -XPUT node2:9200/test/test/3?pretty -d '{
  "foo":"World Hello"
}'

curl node2:9200/test/_search?pretty -d '{
  "query":{
	"match_phrase":{
	  "foo":"hello world"
	}
  }
}'
match_phrase_prefix

match_phrase_prefix和match_phrase类似,不过match_phrase_prefix支持最后一个term前缀匹配:

curl node2:9200/test/_search?pretty -d '{
  "query":{
    "match_phrase_prefix":{
	  "foo":"hello w"
	}
  }
}'
multi_match

multi_match是match的升级,用于搜索多个字段。查询语句为"java编程",查询域为title和description,查询语句如下:

curl node2:9200/books/_search?pretty -d'{
  "query":{
    "multi_match":{
      "query":"java编程",
      "fields":[ "title", "description" ]
    }
  }
}'

multi_match支持对要搜索的字段名称使用通配符。

curl node2:9200/_search?pretty -d '{
  "query":{
    "multi_match":{
      "query":"java编程",
      "fields":["title", "*_name"]   user_name   pro_name  dev_name
    }
  }
}'

也可以使用指数符指定搜索字段的权重。指定关键词出现在title中的权重是出现在description字段中的3倍。

curl node2:9200/_search?pretty -d '{
  "query":{
    "multi_match":{
      "query":"java编程",
      "fields":["title^3", "description"]
    }
  }
}'

bool查询

bool查询可以把任意多个简单查询组合在一起,使用must、should、must_not、filter选项来表示简单查询之间的逻辑,每个选项都可以出现0次到多次,含义如下:

  • must:文档必须匹配must选项下的查询条件,相当于逻辑运算的AND
  • should:文档可以匹配should选项下的查询条件也可以不匹配,相当于逻辑运算的OR
  • must_not:与must相反,匹配该选项下的查询条件的文档不会被返回。
  • filter:和must一样,匹配filter选项下的查询条件的文档才会被返回,但是filter不评分,只起到过滤作用。

假设要查询title中包含关键字java,并且price不能高于70,description可以包含也可以不包含”虚拟机”的书籍,构造bool查询语句如下:

curl node2:9200/books/_search?pretty -d '{
  "query":{
    "bool":{
      "must":{
        "match":{"title": "java"}
      },
      "should":[
        {"match":{"description":"虚拟机"}}
      ],
      "must_not":{
        "range":{"price":{"gte":70}}
      }
    }
  }
}'
自定义高亮片段:
curl node2:9200/books/_search?pretty -d '{
  "query":{
    "match":{"title":"javascript"}
  },
  "highlight":{
    "fields":{
      "title":{
        "pre_tags":[""],
        "post_tags":[""]
      }
    }
  }
}'

curl node2:9200/books/_search?pretty -d '{
  "query":{
    "match":{"title":"javascript"}
  },
  "highlight":{
    "fields":{
      "title":{
        "pre_tags":[""],
        "post_tags":[""]
      }
    }
  }
}'

你可能感兴趣的:(ElasticSearch,elasticsearch,大数据,搜索引擎)