我有一个映射的休闲部分:
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中,相同的查询似乎可以正常工作(尽管说实话,数据不是相同的,它使用构面而不是聚合)。
答案 0 :(得分:1)
针对query string
的{{3}}查询明确指出:
如果该字段是
keyword
字段,则分析器将创建一个单个项...
因此,您无需在搜索字符串中添加引号。相反,您需要正确编写查询。当前,您的查询尝试在字段John
中找到术语name
,在documentation中找到术语Doe
!因此,您必须通过以下方式之一重写查询:
在搜索词中添加括号,以便查询解析器可以“理解”必须在name
字段中找到所有单词:
{
"query": {
"query_string": {
"query": "+(name:(John Doe))",
"fields": [
]
}
},
"aggregations": {
"name": {
"terms": {
"field": "name",
"size": 10
}
}
}
}
在fields
数组中而不是在查询字符串中指定字段名称:
{
"query": {
"query_string": {
"query": "+(John Doe)",
"fields": [
"name"
]
}
},
"aggregations": {
"name": {
"terms": {
"field": "name",
"size": 10
}
}
}
}