一、最佳字段 (Best Fields)
当字段之间相互竞争,⼜又相互关联。例例如 title 和 body 这样的字段。评分来⾃自最匹配字段
POST blogs/_search
{
"query": {
"dis_max": {
"queries": [
{ "match": { "title": "Quick pets" }},
{ "match": { "body": "Quick pets" }}
],
"tie_breaker": 0.2
}
}
}
POST blogs/_search
{
"query": {
"multi_match": {
"type": "best_fields",
"query": "Quick pets",
"fields": ["title","body"],
"tie_breaker": 0.2,
"minimum_should_match": "20%"
}
}
}
POST books/_search
{
"multi_match": {
"query": "Quick brown fox",
"fields": "*_title"
}
}
POST books/_search
{
"multi_match": {
"query": "Quick brown fox",
"fields": [ "*_title", "chapter_title^2" ]
}
}
- Best Fields 是默认类型,可以不不⽤用指定
- Minimum should match 等参数可以传
递到⽣生成的 query中
二、多数字段 (Most Fields)
处理英⽂内容时:⼀种常见的手段是,在主字段( English Analyzer),抽取词干(去掉单复数、时态变化),加入同义词,以匹配更多的⽂文档。
相同的文本,加⼊⼦字段(Standard Analyzer),以提供更加精确的匹配。
其他字段作为匹配文档提⾼相关度的信号。匹配字段越多则越好
一个小例子 英⽂文分词器器,导致精确度降低,时态信息丢失
PUT /titles
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "english"
}
}
}
}
POST titles/_bulk
{ "index": { "_id": 1 }}
{ "title": "My dog barks" }
{ "index": { "_id": 2 }}
{ "title": "I see a lot of barking dogs on the road " }
GET titles/_search
{
"query": {
"match": {
"title": "barking dogs"
}
}
}
![](https://img.haomeiwen.com/i15999829/9545a449583d18e0.png)
将最短匹配的term,返回
使用多数字段匹配解决
- ⽤用⼴广度匹配字段 title 包括尽可能多的⽂文档——以提
升召回率——同时⼜又使⽤用字段 title.std 作为信号 将
相关度更更⾼高的⽂文档置于结果顶部。
DELETE /titles
PUT /titles
{
"mappings": {
"properties": {
"title": {
"type": "text",
"analyzer": "english",
"fields": {"std": {"type": "text","analyzer": "standard"}}
}
}
}
}
POST titles/_bulk
{ "index": { "_id": 1 }}
{ "title": "My dog barks" }
{ "index": { "_id": 2 }}
{ "title": "I see a lot of barking dogs on the road " }
GET /titles/_search
{
"query": {
"multi_match": {
"query": "barking dogs",
"type": "most_fields",
"fields": [ "title", "title.std" ]
}
}
}
- 每个字段对于最终评分的贡献可以通过⾃自定义
值 boost 来控制。⽐比如,使 title 字段更更为重要,
这样同时也降低了了其他信号字段的作⽤用
提升个别字段
个别字段可以通过caret语法()进行提升:仅需要在字段名后添加boost,其中的boost是一个浮点数
GET /titles/_search
{
"query": {
"multi_match": {
"query": "barking dogs",
"type": "most_fields",
"fields": [ "title^10", "title.std" ]
}
}
}
三、混合字段 (Cross Field)
对于某些实体,例如人名,地址,图书信息。需要在多个字段中确定信息,单个字段只能作为整体
的一部分。希望在任何这些列出的字段中找到尽可能多的词
跨字段搜索
- 无法使用Operator
-
可以用copy_to解决,但是需要额外的存储空间
image.png
使用Cross Field 解决
![](https://img.haomeiwen.com/i15999829/f567319d66de35e8.png)
- 支持使用Operator
- 与 copy_to, 相⽐比,其中⼀一个优势就是它可以在搜索时为单个字段提升权重
网友评论