Elasticsearch的结构化搜索(Structured Search)是指对具有明确格式和结构的数据进行搜索的过程。这类数据包括日期、时间、数字、布尔值等,它们都有精确的格式,可以进行逻辑操作,比如比较数值范围或判断值的大小。结构化数据也可以包括具有离散集合的文本字段,例如预定义的标签集合或具有固定选项的字段。
结构化搜索的关键特点:
-
**精确匹配**:结构化搜索通常用于查找与查询条件完全匹配的项。
-
**范围查询**:可以对数字或日期类型的字段执行范围查询。
-
**逻辑操作**:可以对结构化字段执行逻辑操作,如等于(=)、不等于(!=)、大于(>)、小于(<)等。
-
**无相关性评分**:结构化搜索的结果通常不涉及相关性评分,因为它们是确定性的匹配。
-
**使用Term查询**:对于结构化数据,Elasticsearch主要使用Term查询来执行精确匹配。
结构化搜索的常见查询类型:
-
**Term Query**:用于执行精确匹配,适用于结构化字段。
-
**Terms Query**:用于查找包含任一指定值的文档。
-
**Range Query**:用于根据数值或日期范围筛选文档。
-
**Prefix Query**:用于匹配以特定前缀开始的项,适用于结构化文本字段。
-
**Wildcard Query**:用于执行通配符搜索,可以匹配任意字符或任意数量的字符。
-
**Regexp Query**:用于执行正则表达式匹配。
-
**Exists Query**:用于查找包含指定字段的文档,无论字段的值是什么。
示例:
以下是一些结构化搜索的查询示例:
**1. 布尔值查询**:
```json
GET /products/_search
{
"query": {
"term": {
"available": true
}
}
}
```
这个查询将返回所有`available`字段值为`true`的文档。
**2. 数值范围查询**:
```json
GET /products/_search
{
"query": {
"range": {
"price": {
"gte": 10,
"lte": 50
}
}
}
}
```
这个查询将返回所有`price`字段值在10到50之间的文档。
**3. 日期范围查询**:
```json
GET /products/_search
{
"query": {
"range": {
"date": {
"gte": "2020-01-01",
"lt": "2020-12-31"
}
}
}
}
```
这个查询将返回所有`date`字段值在2020年1月1日到2020年12月31日之间的文档。
结构化搜索在Elasticsearch中非常有用,特别是在需要对具有明确格式的数据执行精确匹配或范围查询的场景中。通过使用合适的查询类型,可以有效地检索和管理结构化数据。
Elasticsearch支持两种主要类型的搜索:基于词项(Term-based)的搜索和基于全文(Full-text)的搜索。这两种搜索方式适用于不同的场景和需求。
基于词项的搜索
基于词项的搜索适用于精确匹配的场景,如搜索特定的关键词或短语。这种搜索方式不会对文本进行分词处理,而是直接按照文本的原样进行匹配。
**特点**:
-
通常用于`keyword`类型的字段。
-
不进行文本分析,即不会应用分词器和过滤器。
-
匹配整个词项,不区分大小写。
-
适用于结构化数据,如ID、状态码、标签等。
**查询示例**:
```json
GET /my_index/_search
{
"query": {
"term": {
"status.keyword": {
"value": "active"
}
}
}
}
```
在这个例子中,我们使用`term`查询来搜索`status`字段中精确匹配"active"的文档。
基于全文的搜索
基于全文的搜索适用于对文本内容进行复杂查询的场景,如模糊搜索、短语搜索或相关性搜索。这种搜索方式会对文本进行分词处理,然后基于分词后的词项进行匹配。
**特点**:
-
通常用于`text`类型的字段。
-
应用文本分析,包括分词器和过滤器。
-
可以进行模糊匹配、短语匹配和相关性评分。
-
适用于非结构化数据,如文章、描述、评论等。
**查询示例**:
```json
GET /my_index/_search
{
"query": {
"match": {
"content": "Elasticsearch guide"
}
}
}
```
在这个例子中,我们使用`match`查询来搜索`content`字段中包含"Elasticsearch"和"guide"的文档。
区别和使用场景
-
**数据类型**:基于词项的搜索通常用于`keyword`类型字段,而基于全文的搜索用于`text`类型字段。
-
**文本分析**:基于词项的搜索不进行文本分析,而基于全文的搜索会应用分词器和过滤器。
-
**匹配方式**:基于词项的搜索进行精确匹配,基于全文的搜索可以进行模糊匹配和短语匹配。
-
**适用场景**:基于词项的搜索适用于需要精确匹配的场景,如状态码、枚举值等;基于全文的搜索适用于需要复杂文本分析的场景,如搜索引擎、内容推荐等。
理解这两种搜索方式的区别和适用场景对于设计和实现有效的Elasticsearch搜索策略至关重要。通过合理选择字段类型和查询方式,可以优化搜索效果和性能。