match查询

来源:互联网 发布:深圳软件产业基地招聘 编辑:程序博客网 时间:2024/06/08 03:19

全文搜索(full text search):

对于文本的查询可以分为两类:基于词条的查询(Term-based Queries)和全文查询(Full-Text Queries)

基于词条的查询:

类似于term和fuzzy的查询是不含有解析阶段的低级查询。它们在单一词条上进行操作。一个针对词条Foo的term查询会在倒排索引中寻找该词条的精确匹配(Exact term),然后对每一份含有该词条的文档通过TF/IDF进行相关度_score的计算。

尤其需要记住的是,term查询只会在倒排索引中寻找该词条的精确匹配,它不会匹配诸如foo或者FOO这样的变体。如果你索引了["Foo","Bar"]到一个not_analyzed字段中,或者所引导到一个使用whitespace解析器的字段中,他们都会在倒排索引中得到两个词条:"Foo"以及"Bar"。

全文查询:

类似match和query_string这样的查询是高级查询,它们能够理解一个字段的映射。

<1>如果你使用它们去查询一个date或者integer字段,它们会将查询字符串分别当做日期或者整型数。

<2>如果你查询的是一个精确值(not_analyzed)字符串字段,它们会将整个查询字符串当做一个单独的词条。

<3>如果你查询一个全文字符串(analyzed),它们会首先将查询字符串传入到合适的解析器,用来得到需要查询的词条列表。一旦查询得到了一个词条列表,它就会使用列表中的每个词条来执行合适的低级搜索,然后将得到的结果合并,最终产生没分文档的相关度分析值。

在很少情况下,你猜需要直接使用基于词条(Term-based Queries)的低级查询。通常你需要查询的是全文而不是独立的词条,而这个工作通过高级查询来完成会比较容易(最终会转换为低级查询)。

如果你发现你需要在一个not_analyzed字段上查询一个精确值,那么请认真考虑一下是否需要一个查询而不是过滤器。

单条查询通常代表了一个yer|no的二元问题,这类问题通常使用过滤器进行表达更为合适,因为它们也能够得益于过滤器缓存机制。

GET /_search{    "query": {        "filtered": {            "filter": {                "term": { "gender": "female" }            }        }    }}
match查询:
在你需要对任何字段进行查询的时候,match查询应该是你的首选。它是一个高级全文搜索,意味着他知道如何处理全文字段【full-text analyzed】和精确字段【Exact-value,not_analyzed】
即便如此,match查询的主要使用场景仍然是全文搜索。通过下面的例子介绍全文搜索是怎么工作的:
PUT /my_index{ "settings": { "number_of_shards": 1 }} POST /my_index/my_type/_bulk{ "index": { "_id": 1 }}{ "title": "The quick brown fox" }{ "index": { "_id": 2 }}{ "title": "The quick brown fox jumps over the lazy dog" }{ "index": { "_id": 3 }}{ "title": "The quick brown fox jumps over the quick dog" }{ "index": { "_id": 4 }}{ "title": "Brown fox brown dog" }
个新的索引:首先,创建一个新的索引:
PUT /my_index{ "settings": { "number_of_shards": 1 }} POST /my_index/my_type/_bulk{ "index": { "_id": 1 }}{ "title": "The quick brown fox" }{ "index": { "_id": 2 }}{ "title": "The quick brown fox jumps over the lazy dog" }{ "index": { "_id": 3 }}{ "title": "The quick brown fox jumps over the quick dog" }{ "index": { "_id": 4 }}{ "title": "Brown fox brown dog" }
单词查询(Single word query)
GET /my_index/my_type/_search{    "query": {        "match": {            "title": "QUICK!"        }    }}
ES会按照以下的方式执行上面的match语句:
<1>检查字段类型
title字段是一个全文字符串字段(analyzed),意味着查询字符串也需要被解析。
<2>解析查询字符串
查询字符串"QUICK!"会被传入到标准解析器当中,得到的结果是单一词条"quick"。以为我们得到的只有一个词条,match查询会使用一个term低级查询来执行查询。
<3>找到匹配的文档
term查询会在倒排索引中查询"quick",然后获取到含有该词条的文档列表。
<4>对每份文档进行打分
term查询会为每份匹配的文档计算器相关度分值_score.
"hits": [ {    "_id":      "1",    "_score":   0.5,     "_source": {       "title": "The quick brown fox"    } }, {    "_id":      "3",    "_score":   0.44194174,     "_source": {       "title": "The quick brown fox jumps over the quick dog"    } }, {    "_id":      "2",    "_score":   0.3125,     "_source": {       "title": "The quick brown fox jumps over the lazy dog"    } }]
文档1最相关,因为quik在字符串当中所占的比重最大。

0 0
原创粉丝点击