查询的三种场景
- 最佳字段(Best Fields)
- 当字段之间互相竞争,又相互关联。例如title和body这样的字段。评分来自最匹配字段
- 多数字段(Most Fields)
- 处理英文内容时:一种常见的手段是,在主字段(English Analyzer),抽取词语,加入同义词。以匹配更多的文档。相同的文本,加入子字段(Standard Analyzer),以提供更加精确的匹配。其他字段作为匹配文档提高相关度的信号。匹配字段越多则越好
- 混合字段(Cross Field)
- 对于某些实体,例如人命,地址,图书信息。需要在多个字段中确定信息,单个字段只能作为整体的一部分。希望在任何这些词列出的字段中找到尽可能多的词
Multi Match Query
- Best Fields是默认类型,可以不用指定
- minimum should match等参数可以传递到生成的query中
- Demo
DELETE titles
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"
}
}
}
仅匹配到id2的文档,下面经过multi match怎么修改
# 优化
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",
"fields": ["title", "title.std"]
}
}
}
使用多数字段匹配解决问题
- 用广度匹配的字段title包括尽可能多的文档:以提升召回率。同时又使用字段title.std做诶信号将相关度更好的文档置于结果顶部
- 每个字段对于最终评分的贡献可以通过自定义值boost来控制。比如,使title字段更为重要,这样同时也降低了其他信号字段的作用
跨字段搜索
- 无法使用Operator
- 可以使用copy_to解决,但是需要额外的存储空间
- 支持使用Operator
- 与copy_to相比,其中一个优势就是它可以在搜索时为单个字段提升权重