我是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将使用动态映射.
对于字符串字段,它会将字符串传递给标准分析器,该分析器将其缩小(除其他外).这就是您的查询不起作用的原因.
你的选择是:
index: not_analyzed)之前不对其进行分析.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不被视为文字),这意味着您必须小心提供它.因此,使用术语过滤器进行显式映射可能更适合您的用例.
| 归档时间: |
|
| 查看次数: |
9699 次 |
| 最近记录: |