以下 ElasticSearch 查询给出了预期结果:
{'query': {'bool': {'must': [{'bool': {'should': [{'term': {'name.keyword': 'Finding'}}]}}]}}, 'size': 10, 'from': 0}
Run Code Online (Sandbox Code Playgroud)
但这给出了空结果。
{'query': {'bool': {'must': [{'bool': {'should': [{'term': {'name.keyword': 'finding'}}]}}]}}, 'size': 10, 'from': 0}
Run Code Online (Sandbox Code Playgroud)
唯一不同的是“发现”改为“发现”。ElasticSearch 默认情况下“不区分大小写”,我有以下映射。我期望两个查询都会给我相同的结果。这是怎么回事?
"name": {
"type": "text",
"analyzer": "keyword",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
Run Code Online (Sandbox Code Playgroud)
术语查询返回字段中包含的确切文档。它不会分析正在搜索的术语。
在第一种情况下,您使用的是关键字分析器( name.keyword)。这将标记Finding化为Finding. 因此,当您使用术语查询来搜索 时Finding,这将返回包含确切术语的文档Finding
在第二种情况下,您正在查询name字段。如果未指定分析器,Elasticsearch 将使用标准分析器。所以,这里Finding被标记为finding。
现在,如果您finding使用术语查询进行搜索,您将不会得到任何搜索结果。由于索引中没有包含以下内容的文档"name":"finding"
从 7.10 开始,elasticsearch 引入了一个新参数case_insensitive,它允许我们进行不区分大小写的搜索。
{
"query": {
"term": {
"name.keyword": {
"value": "finding",
"case_insensitive": true
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果您使用的Elasticsearch版本低于7.10.0,那么您应该使用匹配查询进行全文搜索
| 归档时间: |
|
| 查看次数: |
1422 次 |
| 最近记录: |