Elasticsearch: query_string 基础查询

袁志蒙 166次浏览

摘要:一. 介绍Elasticsearch 的 `query_string` 查询是一种非常强大的查询,它允许你执行复杂的、全面的搜索,包括模糊匹配、通配符搜索、近似搜索、范围查询等。`query_string...

一. 介绍

Elasticsearch 的 `query_string` 查询是一种非常强大的查询,它允许你执行复杂的、全面的搜索,包括模糊匹配、通配符搜索、近似搜索、范围查询等。`query_string` 查询还支持在多个字段上执行查询,并支持使用布尔逻辑(`AND`、`OR`、`NOT`)。

二. 基本用法

下面是一个基本的 `query_string` 查询示例:

{
    "query": {
        "query_string" : {
            "query" : "(new york city) OR (big apple)"
        }
    }
}

在这个查询中,我们搜索包含 "new york city" 或 "big apple" 的文档。注意我们使用了括号和 `OR` 操作符来组合查询。

三. 在多个字段上搜索

你可以使用 `query_string` 查询在多个字段上执行搜索。例如:

{
    "query": {
        "query_string" : {
            "query" : "content:(new york city OR big apple)"
        }
    }
}

在这个查询中,我们只在 `content` 字段中搜索 "new york city" 或 "big apple"。

你也可以在多个字段上执行搜索,如下所示:

{
    "query": {
        "query_string" : {
            "query" : "(content:(new york city) OR title:(big apple))"
        }
    }
}

在这个查询中,我们在 `content` 字段中搜索 "new york city",并在 `title` 字段中搜索 "big apple"。

四. 使用通配符

`query_string` 查询支持使用通配符。例如:

{
    "query": {
        "query_string" : {
            "query" : "name:jo*"
        }
    }
}

这个查询将匹配 `name` 字段值以 "jo" 开头的所有文档。

五. 使用范围查询

你还可以使用 `query_string` 查询进行范围查询。例如:

{
    "query": {
        "query_string" : {
            "query" : "date:[2012-01-01 TO 2012-12-31]"
        }
    }
}

这个查询将匹配 `date` 字段值在 2012 年之间的所有文档。

六. 使用布尔逻辑

`query_string` 查询支持使用布尔逻辑。例如:

{
    "query": {
        "query_string" : {
            "query" : "(content:(new york city) OR title:(big apple)) AND date:[2012-01-01 TO 2012-12-31]"
        }
    }
}

在这个查询中,我们搜索 `content` 字段包含 "new york city" 或 `title` 字段包含 "big apple" 的文档,并且 `date` 字段的值必须在 2012 年之间。

七.查询指定字段

`default_field` 参数是用于 `query_string` 查询的,它指定了在没有明确字段的情况下应该在哪些字段上执行查询。这个参数的默认值是 `*`(Elasticsearch 6.0之前是 `_all`),意味着在所有字段上执行查询。

`default_field` 可以设置为一个特定的字段名,例如 `title`,也可以设置为一个包含多个字段名的数组,例如 `["title", "description"]`。你还可以使用通配符 `*` 来匹配多个字段,例如 `title.*` 会匹配所有以 `title.` 开头的字段。

这是一个 `default_field` 设置为特定字段的示例:

{
    "query": {
        "query_string" : {
            "default_field" : "title",
            "query" : "apple"
        }
    }
}

在这个查询中,如果 `query` 中的词(例如 "apple")没有指定字段,那么将在 `title` 字段上执行查询。

这是一个 `default_field` 设置为多个字段的示例:

{
    "query": {
        "query_string" : {
            "default_field" : ["title", "description"],
            "query" : "apple"
        }
    }
}

在这个查询中,如果 `query` 中的词(例如 "apple")没有指定字段,那么将在 `title` 和 `description` 字段上执行查询。

请注意,`default_field` 参数只影响没有明确指定字段的查询词。如果 `query` 中的词明确指定了字段(例如 `title:apple`),那么将在指定的字段上执行查询,而不是 `default_field` 中指定的字段。

八.查询所有字段

如果你想在所有字段上执行 `query_string` 查询,你可以使用 `_all` 关键字("default_field" : "_all")。然而,需要注意的是,从 Elasticsearch 6.0 版本开始,`_all` 字段已被弃用。在这种情况下,你可以使用 `*` 来查询所有字段。下面是一个例子:

{
    "query": {
        "query_string" : {
            "query" : "*:apple"
        }
    }
}

在这个查询中,我们查找所有字段中包含 "apple" 的文档。

如果你的索引设置中启用了 `copy_to` 将所有字段的值复制到一个特定的字段(例如,`all_text`),你也可以在这个字段上执行查询:

{
    "query": {
        "query_string" : {
            "default_field" : "all_text",
            "query" : "apple"
        }
    }
}

在这个查询中,我们查找 `all_text` 字段(包含所有其他字段的值)中包含 "apple" 的文档。

请注意,对所有字段进行查询可能会消耗大量资源,特别是在处理大型索引时。因此,除非确实需要,否则最好避免这种做法。

结论

`query_string` 查询是 Elasticsearch 中非常强大的一个查询,它提供了丰富的搜索功能,可以满足各种复杂的搜索需求。然而,由于其复杂性,使用时需要格外注意语法和格式,否则可能导致查询失败或结果不准确。

随机内容

表情

共0条评论
  • 这篇文章还没有收到评论,赶紧来抢沙发吧~