elasticsearch - 处理同一搜索字符串上的精确搜索和部分搜索
问题描述
我想定义可以处理相同搜索值的部分搜索和精确搜索的模式。
精确搜索应始终返回“精确匹配”,在这种情况下,ES 不应将搜索字符串分解为标记。
解决方案
对于属性的部分匹配数据类型应该是text
,而对于确切的应该是keyword
。为了能够同时进行部分搜索和精确搜索,而无需将数据索引到您可以利用的不同属性fields
。它的作用是帮助以不同的方式索引相同的数据。
因此,假设您要索引人员姓名,并具有部分和精确搜索的能力。在这种情况下,映射将是:
PUT test
{
"mappings": {
"_doc": {
"properties": {
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
}
}
让我们索引一些文档:
PUT test/_doc/1
{
"name": "Nishant Saini"
}
PUT test/_doc/2
{
"name": "Nishant Kumar"
}
对于部分搜索,我们必须查询name
字段,它的类型为text
。
GET test/_doc/_search
{
"query": {
"query_string": {
"query": "Nishant Saini",
"field": [
"name"
]
}
}
}
上面的查询将返回两个文档(1 和 2),因为一个标记 ieNishant
出现在 field 的两个文档中name
。
对于精确搜索,我们需要在name.keyword
. 要执行完全匹配,我们可以使用术语查询,如下所示:
{
"query": {
"term": {
"name.keyword": "Nishant Saini"
}
}
}
这将仅匹配 doc 1。
推荐阅读
- php - MySQL 数据库连接:处理此请求时出错
- python - 为什么我在尝试打开 Excel 文件时收到“PermissionError: [Errno 13] Permission denied”?
- javascript - 如何构建伪数生成器以在 JS 和 C# 中具有相同的结果
- javascript - 如何在命令行中运行 Express Js/MongoDB 并关闭终端
- google-drive-api - 获取 G Drive 中的所有用户文件
- python-3.x - PyMongo 由于事务而无法更新 MongoDB
- django - Django:在 URL 中使用 Slug 时出现“找不到页面”错误
- c# - IDX10501:签名验证失败。无法匹配键
- android - 用户从 Firebase 注销时显示登录
- python - 使用 MapReducer MRJob 和我的映射器函数给了我一个 indexerror: list index out of range