Elasticsearch术语查询不会给出任何结果

May*_*yas 6 elasticsearch

我是Elasticsearch的新手,我必须执行以下查询:

GET book-lists/book-list/_search
{  
   "query":{  
      "filtered":{  
         "filter":{  
            "bool":{  
               "must":[  
                  {  
                     "term":{  
                        "title":"Sociology"
                     }
                  },
                  {  
                     "term":{  
                        "idOwner":"17xxxxxxxxxxxx45"
                     }
                  }
               ]
            }
         }
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

根据Elasticsearch API,它等同于伪SQL:

SELECT document
FROM   book-lists
WHERE  title = "Sociology"
       AND idOwner = 17xxxxxxxxxxxx45
Run Code Online (Sandbox Code Playgroud)

问题是我的文档看起来像这样:

{  
   "_index":"book-lists",
   "_type":"book-list",
   "_id":"AVBRSvHIXb7carZwcePS",
   "_version":1,
   "_score":1,
   "_source":{  
      "title":"Sociology",
      "books":[  
         {  
            "title":"The Tipping Point: How Little Things Can Make a Big Difference",
            "isRead":true,
            "summary":"lorem ipsum",
            "rating":3.5
         }
      ],
      "numberViews":0,
      "idOwner":"17xxxxxxxxxxxx45"
   }
}
Run Code Online (Sandbox Code Playgroud)

并且上面的Elasticsearch查询不会返回任何内容.

然而,此查询返回上面的文档:

GET book-lists/book-list/_search
{  
   "query":{  
      "filtered":{  
         "filter":{  
            "bool":{  
               "must":[  
                  {  
                     "term":{  
                        "numberViews":"0"
                     }
                  },
                  {  
                     "term":{  
                        "idOwner":"17xxxxxxxxxxxx45"
                     }
                  }
               ]
            }
         }
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

这让我怀疑"标题"是两个字段的同名这一事实.

有没有办法解决这个问题,而无需重命名任何字段.或者我在其他地方错过了它?

感谢任何想要帮助的人.

sol*_*oke 11

您的问题在文档中描述.

我怀疑你的索引上没有任何显式映射,这意味着elasticsearch将使用动态映射.

对于字符串字段,它会将字符串传递给标准分析器,该分析器将其缩小(除其他外).这就是您的查询不起作用的原因.

你的选择是:

  1. 在字段上指定显式映射,以便在存储到index(index: not_analyzed)之前不对其进行分析.
  2. 清理您的术语查询,然后将其发送到elasticsearch(在此特定查询中,lowercasing将起作用,但请注意,标准分析器还会执行其他操作,例如删除停用词,因此根据标题,您可能仍会遇到问题).
  3. 使用不同的查询类型(例如,query_string而不是term在运行之前分析查询).

查看存储的数据类型,您可能需要指定显式not_analyzed映射.

对于选项三,您的查询将如下所示:

{  
   "query":{  
      "filtered":{  
         "filter":{  
            "bool":{  
               "must":[  
                  {  
                     "query_string":{  
                        "fields": ["title"],
                        "analyzer": "standard",
                        "query": "Sociology"
                     }
                  },
                  {  
                     "term":{  
                        "idOwner":"17xxxxxxxxxxxx45"
                     }
                  }
               ]
            }
         }
      }
   }
}
Run Code Online (Sandbox Code Playgroud)

请注意,query_string查询具有特殊语法(例如,OR和AND不被视为文字),这意味着您必须小心提供它.因此,使用术语过滤器进行显式映射可能更适合您的用例.