bool
查询是多语句查询的主干。它的适用场景很多,特别是当需要将不同查询字符串映射到不同字段的时候。
问题在于,目前有些用户期望将所有的搜索项堆积到单个字段中,并期望应用程序能为他们提供正确的结果。有意思的是多字段搜索的表单通常被称为 高级查询 (Advanced Search) —— 只是因为它对用户而言是高级的,而多字段搜索的实现却非常简单。
对于多词(multiword)、多字段(multifield)查询来说,不存在简单的 万能 方案。为了获得最好结果,需要 了解我们的数据 ,并了解如何使用合适的工具。
当用户输入了单个字符串查询的时候,通常会遇到以下三种情形:
- 最佳字段
-
当搜索词语具体概念的时候,比如 “brown fox” ,词组比各自独立的单词更有意义。像
title
和body
这样的字段,尽管它们之间是相关的,但同时又彼此相互竞争。文档在 相同字段 中包含的词越多越好,评分也来自于 最匹配字段 。 - 多数字段
-
为了对相关度进行微调,常用的一个技术就是将相同的数据索引到不同的字段,它们各自具有独立的分析链。
主字段可能包括它们的词源、同义词以及 变音词 或口音词,被用来匹配尽可能多的文档。
相同的文本被索引到其他字段,以提供更精确的匹配。一个字段可以包括未经词干提取过的原词,另一个字段包括其他词源、口音,还有一个字段可以提供 词语相似性 信息的瓦片词(shingles)。
其他字段是作为匹配每个文档时提高相关度评分的 信号 , 匹配字段越多 则越好。
- 混合字段
-
对于某些实体,我们需要在多个字段中确定其信息,单个字段都只能作为整体的一部分:
-
Person:
first_name
和last_name
(人:名和姓) -
Book:
title
、author
和description
(书:标题、作者、描述) -
Address:
street
、city
、country
和postcode
(地址:街道、市、国家和邮政编码)
在这种情况下,我们希望在 任何 这些列出的字段中找到尽可能多的词,这有如在一个大字段中进行搜索,这个大字段包括了所有列出的字段。
-
上述所有都是多词、多字段查询,但每个具体查询都要求使用不同策略。本章后面的部分,我们会依次介绍每个策略。