ElasticSearch中march、term查询总结

我的使用总结的,不必定全面和正确,仅供参考api

ElasticSearch版本:5.1
march 对输入进行分词
term 不对输入进行分词,直接搜索app

字段类型:
text:会对字段进行处理,分词,造成分词表,转换成小写
keyword:保持不变spa

对text和keyword的搜索支持(仅仅是手动设定了mapping的基础上).net

  text keyword
march 若在分词表中,匹配输入的关键词,无需转换大小写 能够匹配输入的关键词,无需转换大小写
term

能够匹配输入的关键词,把原英文字符转换成小写后,若在分词表中,就能够匹配
若输入和字段的内容彻底一致,匹配不到code

输入的关键词必需要和字段内容、大小写彻底一致才能匹配

 

实例:
mapping:
 blog

PUT test
{
	"mappings":{
		"doc":{
			"properties":{
				"content":{
					"type":"text",
					"store": true,
					"analyzer": "ik_max_word"
				},
				"title":{
					"type":"keyword"
				},
				"tags":{
					"type":"keyword"
				}
			}
		}
	}
}

 

插入的数据:(由于试验方便,输入插入的比较零散)
 ci

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

POST test/doc
{
  "content":"中国是世界上人口最多的国家",
  "title":"中国",
  "tags":["中国","人口"]
}

POST test/doc
{
  "content":"中国是世界上人口最多的国家",
  "title":"中国 的人口",
  "tags":["中国","人口"]
}

POST test/doc
{
  "content":"Xixi Haha xixihaha",
  "title":"Xixi Haha",
  "tags":["xixi","haha"]
}

POST _bulk
{"index":{"_index":"test","_type":"doc"}}
{"content":"同一个世界同一个梦想","title":"北京奥运","tags":["和平"]}
{"index":{"_index":"test","_type":"doc"}}
{"content":"杭州是一个美丽的城市,欢迎来到杭州","title":"宣传","tags":["旅游","城市"]}

 

重点操做term
term中文下对text的查询:it

GET test/doc/_search
{
  "query":{
    "term": {
      "content":"同一个世界"
    }
  }
}

没有结果table

term中文下对keyword的查询:ast

GET test/doc/_search
{
  "query":{
    "term": {
      "title":"北京奥运"
    }
  }
}

结果搜索到了

关键词变成“北京”,就不行

term对text字段的查询:
输入的文字,在分词表中:

GET test/doc/_search
{
  "query":{
    "term": {
      "content":"美丽"
    }
  }
}

能够匹配
若:

GET test/doc/_search
{
  "query":{
    "term": {
      "content":"美"
    }
  }
}

就没有结果

缘由是:美丽在分词表中,美这个字不在。这种状况match和term都不行
 

网上看到了一篇文章,是在没有指定mapping的状况下,解决方案,以资参考。
http://blog.csdn.net/SunnyYoona/article/details/51842221
没有指定mapping的状况下,Elasticsearch会自动建立一个mapping.
可是这个maping感受有点小复杂...
为嘛一个字段,既有text,又有keyword类型....