elasticsearch笔记_全文搜索_query(五)

来源:互联网 发布:国产入门耳机推荐 知乎 编辑:程序博客网 时间:2024/04/30 05:40

全文搜索(Query)

全文搜索最重要的两个方面就是”相关性(Relevance)”和”分析(Analysis)” .

相关性(Relevance)

每个文档都有相关性评分,用一个正浮点数字段 _score 来表示 。_score 评分越高 , 相关性就越高 。

检索词频率TF(Token Frequency):检索词出现的频率,出现频率越多,相关性越高.(例如:检索词出现5次比出现1次的的相关性要高.)

反向文档频率IDF(Inverse Document Frequency):每个词在索引(名词)中出现的频率,频率越高,相关性越低。检索词出现在多数文档中会比出现在少数文档中的权重更低。

字段长度准则:字段的长度.长度越长,相关性越低。检索词出现在一个短的 title 要比同样的词出现在一个长的 content 字段权重更大。

注意 : 相关性的概念并不只用于全文搜索,也适用于 yes|no 的子句,匹配的子句越多,相关性评分越高。

关于TF/IDF的解释:

有很多不同的数学公式可以用来计算TF-IDF。这边的例子以上述的数学公式来计算。词频 (TF) 是一词语出现的次数除以该文件的总词语数。假如一篇文件的总词语数是100个,而词语“母牛”出现了3次,那么“母牛”一词在该文件中的词频就是3/100=0.03。一个计算文件频率 (IDF) 的方法是测定有多少份文件出现过“母牛”一词,然后除以文件集里包含的文件总数。所以,如果“母牛”一词在1,000份文件出现过,而文件总数是10,000,000份的话,其逆向文件频率就是 log(10,000,000 / 1,000)=4。最后的TF-IDF的分数为0.03 * 4=0.12。

主要是为了去掉无用词条,例如汉语里面的”的”,”是”等无用词.

分析(Analysis)

它是将文本块转换为有区别的、规范化的 token 的一个过程 . 详细 : elasticsearch笔记_映射,分析器(三)

match查询(单个词搜索)

match查询最强大 , 既能处理全文字段 , 又能处理精确字段 .

1 : 搜索关键字是一个单个字.GET /my_index/my_type/_search{    "query": {        "match": {            "title": "QUICK!"        }    }}

查询步骤 :
1.检查字段类型 : 标题 title 字段是一个 string 类型( analyzed )已分析的全文字段,这意味着查询字符串本身也应该被分析。

2.分析查询字符串 : 将查询的字符串 QUICK! 传入标准分析器中,输出的结果是单个项 quick 。因为只有一个单词项,所以 match 查询执行的是单个底层 term 查询。

3.查找匹配文档 :用 term 查询在倒排索引中查找 quick 然后获取一组包含该项的文档.

4.为每个文档评分 (根据相关性的判断)。

match搜索(多词搜索)

2:搜索关键字是一组单词.GET /my_index/my_type/_search{    "query": {        "match": {            "title": "BROWN DOG!"        }    }}

查询步骤 : 将多个关键字进行拆分 , 它在内部实际上先执行两次 term 查询,然后将两次查询的结果合并作为最终结果输出。为了做到这点,它将两个 term 查询包入一个 bool 查询中.

精确度控制

在上面的搜索里面,只要包含两个关键字的任意一个的文档就被认为是符合要求的 . 换句话说匹配的是 brown OR dog ,如果希望匹配 brown AND dog 去检索文档,可以控制match里面的operator参数 .

GET /my_index/my_type/_search{    "query": {        "match": {            "title": {                      "query":    "BROWN DOG!",                "operator": "and"            }        }    }}

如果关键词是4个,想要匹配3个,这种情况可以使用minimum_should_match参数,配置参数为75%:

GET /my_index/my_type/_search{  "query": {    "match": {      "title": {        "query":                "quick brown dog",        "minimum_should_match": "75%"      }    }  }}

如果关键字是3个,还写了75%,会被默认为66.6%.

组合查询(bool查询)的评分标准和精确度控制

评分标准 :

bool过滤的must 、 must_not 和 should在bool查询这里一样可以用,不过bool查询除了决定一个文档是否应该被包括在结果中,还会计算文档的 相关程度 。

GET /my_index/my_type/_search{  "query": {    "bool": {      "must":     { "match": { "title": "quick" }},      "must_not": { "match": { "title": "lazy"  }},      "should": [                  { "match": { "title": "brown" }},                  { "match": { "title": "dog"   }}      ]    }  }}

bool 查询会为每个文档计算相关度评分 _score , 再将所有匹配的 must 和 should 语句的分数 _score 求和,最后除以 must 和 should 语句的总数。must_not 语句不会影响评分; 它的作用只是将不相关的文档排除。

精确度控制 : 与match 查询的精度控制一样,我们可以通过 minimum_should_match 参数控制需要匹配的 should 语句的数量, 它既可以是一个绝对的数字,又可以是个百分比

GET /my_index/my_type/_search{  "query": {    "bool": {      "should": [        { "match": { "title": "brown" }},        { "match": { "title": "fox"   }},        { "match": { "title": "dog"   }}      ],      "minimum_should_match": 2  //得有两个should满足条件才算匹配.    }  }}

注意 : 其实多词 match 查询只是简单地将生成的 term 查询包裹 在一个 bool 查询中。如果使用默认的 or 操作符,每个 term 查询都被当作 should 语句,这样就要求必须至少匹配一条语句。

以下两个是等价的:

{    "match": { "title": "brown fox"}}{ "bool": {    "should": [      { "term": { "title": "brown" }},      { "term": { "title": "fox"   }}    ]  }}

以下两个是等价的:

{    "match": {        "title": {            "query":    "brown fox",            "operator": "and"        }    }}{  "bool": {    "must": [      { "term": { "title": "brown" }},      { "term": { "title": "fox"   }}    ]  }}

以下两个是等价的:

{    "match": {        "title": {            "query":                "quick brown fox",            "minimum_should_match": "75%"        }    }}{  "bool": {    "should": [      { "term": { "title": "brown" }},      { "term": { "title": "fox"   }},      { "term": { "title": "quick" }}    ],    "minimum_should_match": 2   }}

权重的提升

可以通过指定 boost 来控制任何查询语句的相对的权重,boost 的默认值为 1 ,大于 1 会提升一个语句的相对权重。举例 :

GET /_search{    "query": {        "bool": {            "must": {                "match": {                      "content": {                        "query":    "full text search",                        "operator": "and"                    }                }            },            "should": [                { "match": {                    "content": {                        "query": "Elasticsearch",                        "boost": 3                     }                }},                { "match": {                    "content": {                        "query": "Lucene",                        "boost": 2                     }                }}            ]        }    }}

上面的例子里面 must语句默认使用的boost值是1 , 关键字 Lucene的boost值设为2 , 使Lucene变得更重要 . Elasticsearch的boost值设为3 ,说明它比Lucene更重要 . 更高的 boost 值为我们带来更高的评分 _score .

注意:boost的值并不一定是线性的,意思就是boost的值设置为2不一定就是boost值为1的两倍 .

关于分析器的说明:

1 . match 查询为每个字段使用合适的分析器,以保证它在寻找每个项时都为该字段使用正确的格式。

2 . 分析器可以从三个层面进行定义:按字段(per-field)、按索引(per-index)或全局缺省(global default)。

3 . Elasticsearch在索引(动词)时会按照以下顺序依次找到能够使用的分析器 :
(1) 字段映射里定义的 analyzer .
(2) 索引设置中名为 default 的分析器.
(3) standard 标准分析器.

4 . Elasticsearch在搜索时会按照以下顺序依次找到能够使用的分析器 :
(1) 查询自己定义的 analyzer ,否则
(2) 字段映射里定义的 search_analyzer ,否则
(3) 字段映射里定义的 analyzer ,否则
(4) 索引设置中名为 default_search 的分析器,默认为
(5) 索引设置中名为 default 的分析器,默认为
(6) standard 标准分析器

0 0
原创粉丝点击