Elasticsearch完全匹配不能正常工作

时间:2017-04-21 12:05:47

标签: java elasticsearch

我使用elasticsearch进行日志记录。我有一个名为" query_index"的索引。有四个内部领域。我使用以下映射来创建此索引:

POST
/query_index/queries

{
  "mappings": {
    "queries": {
      "properties": {
        "query": {
          "type": "string",
          "store": true 
        },
          "exact_match":{
            "type":"string",
              "index":"not_analyzed"
          },
          "search_type": {
            "type" : "string",
              "store": true
          },
        "search_engine": {
            "type" : "string",
              "store": true
          }
      }
    }
  }
}

当你看到第二个字段时,我把" exact_match"作为not_analyzed字段,以便检索完全匹配的查询。

我们说我在这个索引中持有两个文件:

{
    "query": "Barack Obama",
    "exact_match": "Barack Obama",
    "search_engine": "google",
    "search_type": "api"
}


{
    "query": "Barack",
    "exact_match": "Barack",
    "search_engine": "google",
    "search_type": "api"
}

现在我想只检索第二个文档。所以我使用以下查询:

Post
/query_index/queries/_search

{"query":
            {"bool":
                {"must":
                    [
                      { "match": { "exact_match": "Barack" }},
                      { "match": { "search_engine": "google" }},
                      { "match": { "search_type": "api" }}
                    ]
                }
            }

}

但是在运行上述查询之后,我会检索这两个文档,而我希望检索第二个文档。我几乎搜索了整个Stack,但是我没有得到我应该做的结果。

更新

GET
/query_index/_mapping
{
"query_index": {
"mappings": {
"queries": {
"properties": {
"exact_match": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"mappings": {
"properties": {
"queries": {
"properties": {
"properties": {
"properties": {
"exact_match": {
"properties": {
"index": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"type": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
},
"query": {
"properties": {
"store": {
"type": "boolean"
},
"type": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
},
"search_engine": {
"properties": {
"store": {
"type": "boolean"
},
"type": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
},
"search_type": {
"properties": {
"store": {
"type": "boolean"
},
"type": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
}
}
}
},
"query": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"search_engine": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"search_type": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}
}

1 个答案:

答案 0 :(得分:1)

具有该特定映射的正确索引创建命令是PUT而不是POST。使用POST,您只需在该索引中创建一个文档,该文档将自动在索引中创建一些字段结构。

使用此特定映射创建索引的正确命令是:

PUT /query_index
{
  "mappings": {
    "queries": {
      "properties": {
        "query": {
          "type": "string",
          "store": true
        },
        "exact_match": {
          "type": "string",
          "index": "not_analyzed"
        },
        "search_type": {
          "type": "string",
          "store": true
        },
        "search_engine": {
          "type": "string",
          "store": true
        }
      }
    }
  }
}