Elasticsearch 6.3在关键字字段中使用空格查询并且不返回所有文档

时间:2018-10-17 00:33:50

标签: elasticsearch

我有一个映射的休闲部分:

 public ActionResult Students()
 {
 String connectionString = "<THE CONNECTION STRING HERE>";
 String sql = "SELECT * FROM students";
 SqlCommand cmd = new SqlCommand(sql, conn);

var model = new List<Student>();
using(SqlConnection conn = new SqlConnection(connectionString))
{
    conn.Open();
    SqlDataReader rdr = cmd.ExecuteReader();
    while(rdr.Read())
    {
        var student = new Student();
        student.FirstName = rdr["FirstName"];
        student.LastName = rdr["LastName"];
        student.Class = rdr["Class"];
        ....

        model.Add(student);
    }

}

return View(model);

和此查询:

"name": {
    "store": "true",
    "type": "keyword"
}

查询应返回100多个结果,但仅返回少数几个结果。如果我将这样的引号添加到John Doe:\“ John Doe \”,那么它将返回所有想要的结果。

我想知道为什么会这样。将该字段映射为关键字还不够,以便对John Doe进行整体分析,并且不应该添加引号吗?另外,为什么它返回较少的没有引号的项目?

注意:在ES 1.4中,相同的查询似乎可以正常工作(尽管说实话,数据不是相同的,它使用构面而不是聚合)。

1 个答案:

答案 0 :(得分:1)

针对query string的{​​{3}}查询明确指出:

  

如果该字段是keyword字段,则分析器将创建一个单个项...

因此,您无需在搜索字符串中添加引号。相反,您需要正确编写查询。当前,您的查询尝试在字段John中找到术语name,在documentation中找到术语Doe!因此,您必须通过以下方式之一重写查询:

  1. 在搜索词中添加括号,以便查询解析器可以“理解”必须在name字段中找到所有单词:

    {
        "query": {
            "query_string": {
                "query": "+(name:(John Doe))",
                "fields": [
    
                ]
            }
        },
        "aggregations": {
            "name": {
                "terms": {
                    "field": "name",
                    "size": 10
                }
            }
        }
    }
    
  2. fields数组中而不是在查询字符串中指定字段名称:

    {
        "query": {
            "query_string": {
                "query": "+(John Doe)",
                "fields": [
                    "name"
                ]
            }
        },
        "aggregations": {
            "name": {
                "terms": {
                    "field": "name",
                    "size": 10
                }
            }
        }
    }