match查询

match查询是一个散列映射,包含了希望搜索的字段和字符串,默认情况下,match查询使用布尔行为和OR操作符,为了同时搜索多个词,可以将operator字段设置为and.

curl 'localhost:9200/get-together/_search' -d ' {
"query" : {
    "match" : {
        "name" : {
            "query" : "elasticsearch",
            "operator" : "and"
                 }
            }
        }
    }'

phrase查询

可以指定词组之间的间隔,slop用于表示词组中多个分词之间的距离。

curl 'localhost:9200/get-together/group/_search' -d ' {
"query" : {
    "match" : {
        "name" : {
            "type" : "phrase",
            "query": "land row",
            "slop" : 1
         }
    }
},
"_source" : ["name" , "descriptioin"]
}'

multi_match查询

用来匹配多个字段中的词条。

curl 'localhost:9200/get-together/_search' -d ' {
"query" : {
    "multi_match" : {
        "query" : "elasticsearch",
        "fields" : [ "name" , "description" ]   
    }
}
}'

bool查询

bool查询允许在单独的查询中组合任意数量的查询,对于多个查询使用特定的词进行修饰,使用must,should,must_not。对于must匹配,只有匹配上这些查询的结果才会被返回;对于should匹配,文档至少匹配一个should子句才能返回;对于must_not匹配,会使得其匹配的文档从结果集合中被移除。

curl 'localhost:9200/get-together/_search' -d ' {
"query" : {
    "bool" : {
        "must" : [
            {
            "term" : {
                "attendees" : "david"
            }
            }
        ],
         "should" : [
            {
             "term" : {
                "attendees" : "clint"
            }
            },
            {
             "term" : {
                 "attendees" : "andy"
            }
            }
        ],
        "must_not" : [
            {
             "range" : {
                 "date" : {
                     "lt" : "2019-01-8"
                  }
              }
             }
         ],
         minimum_should_match" : 1
        }
    }
}'   
        

bool过滤器和查询版本一致,只不过它是组合的是过滤器而已。

分析数据

分析是在文档被加入到倒排索引之前,elasticsearch在其实例上进行的操作,在文档被加入索引之前,elasticsearch让每个被分析字段经过一系列的处理步骤。步骤有:

字符过滤器:用来转变字符,

文本切分为字符:将文本切分为单个或多个分词,

分词过滤:用来转变每个分词,

分词索引:将分词存储到索引中。

零个或多个字符过滤器,分词器,分词过滤器组成一个分析器。

使用分析器:

有两种方式来指定字段所使用的分析器:

⑴当创建索引的时候,为特定的索引进行设置

curl 'localhost:9200/newindex' -d ' 
{
    "settings" : {                  <---设置
        "number_of_shards" : 2 ,      <--- 主分片
        "number_of_replicas" : 1,       <---副本分片
        "index" : {              <--- 设置索引
            "analysis" : {        <--- 索引的分析设置
                "analyzer" : {      
                     "myCustomerAnalyzer":  {   <----在分析器对象中设置定制分析器
                         "type" : "custom",
                         "tokenizer" : "myCustomTokenizer",
                         "filter" : ["myCustomFilter1","myCustomFilter2"],
                         "char_filter" : ["myCustomCharFilter" ]
                      }
                 },
            "tokenizer" : {      <---定制分词器
                "myCustomTokenizer" : {
                    "type" : "letter"
            }
            "filter" :  {       <---定制过滤器
                "myCustomerFilter1" : {
                    "type" : "lowercase"
                },
                "myCustomerFilter2" : {
                    "type" : "kstem"
                }
            },
            "char_filter" : {   <---字符过滤器
                "myCustomCharFilter: {
                    "type" : "mapping",
                    "mapping" : ["ph>=f" , "u=> you" ]
                 }
             }
        }

    }
},
    "mapping" : {    <---创建索引映射
            ...
     }
}'

⑵在elasticsearch的配置文件中,设置全局的分析器。在elasticsearch.yml中进行设置。和上面的没有区别,只需要将index:之后和mapping之前的复制到elasticsearch.yml中。

在映射中指定某个字段的分析器:

{
    "mapping" : {
        "document" : {
            "properties" : {
                "description" : {
                    "type" : "string",
                    "analyzer" : "myCustomAnalyzer"
                 }
            }
         }
     }  
}

如果想让某个字段不被分析,需要指定index字段为not_analyzed。

使用分析API:

使用标准分析器分析文本 ” hello,everyone ,this is a good boy"

curl -XPOST 'localhost:9200/_analyze?analyzer=standard' -d 'hello ,everyone, this is a good boy '

对于分析器的使用,可以使用analyzer参数来指定分析器,对于创建索引的时候定制的分析器,可以通过名字来指定使用这个分析器,但不在使用HTTP的/_search端点,而是需要先指定索引。

curl -XPOST 'localhost:9200/get-together/_analyze?analyzer=myCustomAnalyzer' -d  'share your experience with Nosql'

elasticsearch内置有很多分析器,eg:

标准分析器:是文本的默认分析器,包括标准分词器,标准分词过滤器,分词过滤器等;

简单分析器:即只使用小写转换分词器;

空白分析器:根据空白将文本切分成若干分词;

停用词分析器:过滤停用词;

关键词分析器:将整个字段作为一个单独的分词

模式分析器,雪球分析器。

分词器有:标准分词器,关键词分词器,字母分词器,小写分词器,空白分词器,模式分词器。

分词过滤有:标准分词过滤器,小写分词过滤器,长度分词过滤器,停用词分词过滤器,ASCII折叠分词过滤器,等等等。

简单介绍Elasticsearch的打分机制:

elasticsearch的打分机制是一个公式,将考量的文档作为输入,然后使用不同的因素来确定该文档的得分,返回更为相关的文档被优先返回,在elasticsearch中这种相关性被称为得分。在计算得分时elasticsearch需要使用被搜索的词的相关信息,词频和逆文档频率。

词频:

一个分词在文本中出现的次数。即当一个词在文档中出现的频率越高,则该文档的得分就越高。

逆文档频率:

如果一个分词在索引的不同文档中出现的次数越多,则它就越不重要。逆文档频率只检查一个词条是否出现在某文档中,并不检查它出现的次数。eg:the,它几乎在每个文档中出现,则证明其并不重要。

其他打分方法有: Okapi BM25 ; 随机性分歧,基于信息的,LM Dirichlet相似度,LM Jelinek Mercer相似度。

 

 

参考《Elasticsearch 实战》  如有错误,敬请指出,部分代码实例来自此书。