Elasticsearch 单字符串多字段查询

前言

有些时候,我们搜索的时候,只会提供一个输入框,但是会查询相关的多个字段,典型的如Google搜索,我们该如何用 Elasticsearch 如何实现呢?

实例

从单字符串查询的实例说起

创建测试例子的数据

DELETE blogs

PUT blogs/_doc/_bulk
{"index":{"_id":1}}
{"title": "Quick brown rabbits","body": "Brown rabbits are commonly seen."}
{"index":{"_id":2}}
{"title": "Keeping pets healthy","body": "My quick brown fox eats rabbits on a regular basis"}
GET blogs/_search
{
  "explain": true,
  "query": {
    "bool": {
      "should": [
        {"match": {"title": "Brown fox"}},
        {"match": {"body": "Brown fox"}}
      ]
    }
  }
}

上面的例子相关性的值是title与body的简单相加,可以通过“"explain": true”打印出来的数据进行查询计算的过程。

最优字段查询调优

可以使用disjunction max query,让其匹配最大相关性那个字段,同时tie_breaker可以调整相关性,取值范围是0~1,可以控制相关性较小那个值占用的比例,默认是0,毕竟只要相关性最大那个字段就好了,其他字段不打分。

GET blogs/_search
{
  "explain": true,
  "query": {
    "dis_max": {
      "queries": [
        {"match": {"title": "Brown fox"}},
        {"match": {"body": "Brown fox"}}
      ],
      "tie_breaker": 0.7
    }
  }
}

相关性的值是title与body中的最大值。

multi_match

multi_match 查询为能在多个字段上反复执行相同查询提供了一种便捷方式。

上面的dis_max例子改写如下

GET blogs/_search
{
  "explain": true, 
  "query": {
    "multi_match": {
      "type": "most_fields", 
      "query": "Brown fox",
      "fields": ["title","body"],
      "tie_breaker": 0.7
    }
  }
}

multi_match 查询

multi_match 支持三种场景

  • best_fields——(默认)查找匹配任何字段的文档,但是使用最佳匹配字段的_score。
  • most_fields——查找匹配任何字段的文档,结合每个字段的_score。
  • cross_fields——用相同的分析器处理字段,把这些字段当作一个大字段。查找任何字段的每个单词。类似copy_to

query中可以指定minimum_should_match、operator等字段,会把这些字段传递到query语句中

best_fields

当搜索词语具体概念的时候,比如 “brown fox” ,词组比各自独立的单词更有意义。像 title 和 body 这样的字段,尽管它们之间是相关的,但同时又彼此相互竞争。文档在相同字段 中包含的词越多越好,评分也来自于最匹配字段 。

best_fields 语句 等同于 dis_max 语句,可以配置tie_breaker参数。

most_fields

全文搜索被称作是 召回率(Recall) 与 精确率(Precision) 的战场: 召回率 ——返回所有的相关文档; 精确率 ——不返回无关文档。目的是在结果的第一页中为用户呈现最为相关的文档。

为了提高召回率的效果,我们扩大搜索范围——不仅返回与用户搜索词精确匹配的文档,还会返回我们认为与查询相关的所有文档。如果一个用户搜索 “quick brown box” ,一个包含词语“fast foxes”的文档被认为是非常合理的返回结果。

提高全文相关性精度的常用方式是为同一文本建立多种方式的索引,每种方式都提供了一个不同的相关度信号signal。主字段会以尽可能多的形式的去匹配尽可能多的文档。

DELETE titles

PUT titles
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "english",
        "fields": {"std": {"type": "text","analyzer": "standard"}}
      }
    }
  }
}
GET /titles/_search
{
  "query": {
    "multi_match": {
      "query":  "barking dogs",
      "type":   "most_fields",
      "fields": [ "title^10", "title.std" ]
    }
  }
}

比如这个例子,文档中的“title”被索引了两次,主字段“title”的分词器是“english”,会提取词干,“a”,“the”等这些会在分词过程中被过滤掉,“ing”等会去除,子字段“title.std”的分词器是“standard”,不会提取词干。

同时指定了boost,比如上面的“title^10”,表示“title”的权重是10。

cross_fields

对于某些实体,我们需要在多个字段中确定其信息,单个字段都只能作为整体的一部分:

Person: first_name 和 last_name (人:名和姓)
Book: title 、 author 和 description (书:标题、作者、描述)
Address: street 、 city 、 country 和 postcode (地址:街道、市、国家和邮政编码)

在这种情况下,我们希望在任何 这些列出的字段中找到尽可能多的词,这有如在一个大字段中进行搜索,这个大字段包括了所有列出的字段。

这个类似copy_to,copy_to需要额外的存储空间,这个不需要。

支持 operator 操作,如果指定的是“and”,那么表示所有词都是必须的。

参考资料

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容