我使用匹配查询搜索" request.method":" GET":
{
"query": {
"filtered": {
"query": {
"match": {
"request.method": "GET"
}
},
"filter": {
"bool": {
"must": [
...
正如预期的那样,匹配查询可以获得结果,如下所示:
但问题是在使用Term查询时,没有结果。
更新查询以更改"匹配" to" term",并保持其他部分保持不变:
{
"query": {
"filtered": {
"query": {
"term": {
"request.method": "GET"
}
},
"filter": {
"bool": {
"must": [
...
我认为Term查询是"未分析"匹配查询的版本。如上图所示,至少有一条记录有" request.method"等于" GET"。为什么上述Term查询没有结果?谢谢。
答案 0 :(得分:79)
假设您使用Standard Analyzer GET
变为get
存储在索引中。源文档仍然具有原始的“GET”。
match
查询将相同的标准分析器应用于搜索词,因此将匹配索引中存储的内容。 term
查询不会将任何分析器应用于搜索字词,因此只会在倒排索引中查找该确切字词。
要在示例中使用术语查询,请将大写“GET”更改为小写“get”或更改映射,以便将request.method字段设置为not_analyzed
。
答案 1 :(得分:2)
elasticsearch 中 term 和 match 的区别
Term 是一个精确的查询
匹配是一个模糊查询
term 是完美匹配,即精确查询。搜索词在搜索之前不会被切分,所以我们的搜索词必须是文档切分集之一。假设我们要查找所有名为 Jesus Verma 的文档。
$curl -XGET http://localhost:9200/index/doc/_search?pretty -d
'{
"query":{
"term":{
"title": "Jesus Verma"
}
}
}'
匹配查询将首先对搜索词进行分类。分词后,分词结果会一一匹配。因此,相较于term的精确搜索,match是分词匹配搜索,匹配搜索有两个功能相似的变体。一种是match_phrase。一种是multi_match
$curl -XGET http://localhost:9200/index/doc/_search?pretty -d
'{
"query": {
"match": {
"content": "Banglore, India"
}
}
}'