匹配查询 Match
如果需要为不同字段设置不同权重,可以考虑使用 bool 查询的 should 子句来组合多个 match 查询,并为每个 match 查询设置不同的权重。
代码语言:javascript复制{
"query": {
"bool": {
"should": [
{
"match": {
"product_name": {
"query": "apple",
"boost": 3
}
}
},
{
"match": {
"description": {
"query": "apple",
"boost": 1
}
}
}
]
}
}
}
上面的查询将在 product_name 字段和 description 字段中搜索包含 "apple" 的文档,并为 product_name 字段设置权重为 3,而为 description 字段设置权重为 1。这样,在计算匹配得分时,product_name 字段的匹配将比 description 字段的匹配更加重要,因为它的权重更高。这种方式可以灵活地控制不同字段的权重,以满足不同的搜索需求。
精确匹配查询 Match_pharse
match_phrase 查询是 Elasticsearch 中一种用于精确匹配短语的查询方式,可以确保查询字符串中的关键词按照给定的顺序在文档中连续出现。以下是 match_phrase 查询的用法
简单用法
match_phrase 查询可以直接指定一个字段和一个短语进行匹配。
代码语言:javascript复制$client = ElasticSearchCLient::getInstance();
$indexParams = [
'index' => 'resty_product_test_index',
'body' => [
'query' => [
'match_phrase' => [
'title' => '开源技术小栈20245直播间'
]
]
]
];
$indexResponse = $client->search($indexParams);
查询结果
代码语言:javascript复制"hits": [
{
"_index": "resty_product_test_index",
"_type": "_doc",
"_id": "20245",
"_score": 2.3340414,
"_source": {
"id": 20245,
"title": "开源技术小栈20245直播间",
"content": "开源技术小栈-腾讯云开发者社区,开源技术小栈20245直播间"
}
}
]
如果'title' => '开源技术小栈'
,则查询结果
"hits": [
{
"_index": "resty_product_test_index",
"_type": "_doc",
"_id": "2024",
"_score": 1.0939294,
"_source": {
"id": 2024,
"title": "开源技术小栈20240724直播间",
"content": "开源技术小栈-腾讯云开发者社区,开源技术小栈20240724直播间"
}
},
{
"_index": "resty_product_test_index",
"_type": "_doc",
"_id": "20245",
"_score": 1.0939294,
"_source": {
"id": 20245,
"title": "开源技术小栈20245直播间",
"content": "开源技术小栈-腾讯云开发者社区,开源技术小栈20245直播间"
}
}
]
位置信息
match_phrase
查询会记录匹配短语在文档中的位置信息,可以通过 slop
参数指定允许的位置偏移量。
$client = ElasticSearchCLient::getInstance();
$indexParams = [
'index' => 'resty_product_test_index',
'body' => [
'query' => [
'match_phrase' => [
'title' => [
'query' => '开源技术小栈20245直播间',
'slop' => 2
]
]
]
]
];
$indexResponse = $client->search($indexParams);
多字段查询 Match multi_match
multi_match 查询可以直接指定一个查询字符串,然后在多个字段中进行搜索。
简单用法
代码语言:javascript复制$client = ElasticSearchCLient::getInstance();
$query = '开源技术小栈';
$indexParams = [
'index' => 'resty_product_test_index',
'body' => [
'query' => [
'multi_match' => [
'query' => $query,
'fields' => ['title', 'content'],
]
]
]
];
$indexResponse = $client->search($indexParams);
查询结果
代码语言:javascript复制"hits": [
{
"_index": "resty_product_test_index",
"_type": "_doc",
"_id": "2024",
"_score": 2.399356,
"_source": {
"id": 2024,
"title": "开源技术小栈20240724直播间",
"content": "开源技术小栈-腾讯云开发者社区,开源技术小栈20240724直播间"
}
},
{
"_index": "resty_product_test_index",
"_type": "_doc",
"_id": "20245",
"_score": 2.399356,
"_source": {
"id": 20245,
"title": "开源技术小栈20245直播间",
"content": "开源技术小栈-腾讯云开发者社区,开源技术小栈20245直播间"
}
},
{
"_index": "resty_product_test_index",
"_type": "_doc",
"_id": "202457879",
"_score": 1.1278633,
"_source": {
"id": 202457879,
"title": "Tinywan",
"content": "开源技术小栈-腾讯云开发者社区,开源技术小栈20245直播间"
}
}
]
上面的查询将在title
和content
字段中搜索包含 开源技术小栈
的文档。
类型匹配
multi_match 查询可以通过 type 参数指定匹配的类型,如 "best_fields"、 "most_fields"、 "cross_fields"、 "phrase"、 "phrase_prefix" 等。不同的类型在匹配方式和结果计算上有所不同。
代码语言:javascript复制$client = ElasticSearchCLient::getInstance();
$query = '开发者社区';
$indexParams = [
'index' => 'resty_product_test_index',
'body' => [
'query' => [
'multi_match' => [
'query' => $query,
'fields' => ['title', 'content'],
"type" => "best_fields"
]
]
]
];
$indexResponse = $client->search($indexParams);
代码语言:javascript复制"hits": [
{
"_index": "resty_product_test_index",
"_type": "_doc",
"_id": "2024",
"_score": 0.7439606,
"_source": {
"id": 2024,
"title": "开源技术小栈20240724直播间",
"content": "开源技术小栈-腾讯云开发者社区,开源技术小栈20240724直播间"
}
},
{
"_index": "resty_product_test_index",
"_type": "_doc",
"_id": "20245",
"_score": 0.7439606,
"_source": {
"id": 20245,
"title": "开源技术小栈20245直播间",
"content": "开源技术小栈-腾讯云开发者社区,开源技术小栈20245直播间"
}
},
{
"_index": "resty_product_test_index",
"_type": "_doc",
"_id": "202457879",
"_score": 0.7439606,
"_source": {
"id": 202457879,
"title": "Tinywan",
"content": "开源技术小栈-腾讯云开发者社区,开源技术小栈20245直播间"
}
}
]
上面的查询将使用 "best_fields" 类型在title
和content
字段中搜索包含短语开源技术小栈
的文档。
高级搜索查询 query_string
在 Elasticsearch 中,query_string 是一种查询方式,用于在文本字段上执行灵活且强大的搜索操作。query_string 查询支持使用 Lucene 查询语法进行高级搜索,可以通过在查询字符串中指定不同的搜索条件、操作符和逻辑关系来构建复杂的搜索查询。
简单的关键词匹配
代码语言:javascript复制$client = ElasticSearchCLient::getInstance();
$query = '开发者社区';
$indexParams = [
'index' => 'resty_product_test_index',
'body' => [
'query' => [
'query_string' => [
'default_field' => 'title',
'query' => $query,
]
]
]
];
$indexResponse = $client->search($indexParams);
上面的查询将在 title
字段中搜索包含关键词 "开发者社区" 的文档。