Match 查询可以接受 text/numeric/date类型的数据。分析并构建一个查询:
GET /_search
{
"query": {
"match" : {
"message" : "this is a test"
}
}
}
注意:message是一个字段。可以替换为其他任意字段。
Match查询是boolean查询的一种类型。这意味着提供的查询数据会被分,分析程序会构建一个Boolean查询。Operator标志可以被设置用来控制布尔语句(默认是or,可以置为and或者or)。should 子句做匹配查询可以使用minimum_should_match
参数用来限制最小的选择条件个数。
get /otp_aap_addr_detail_info_2019_06/_doc/_search
{
"query": {
"bool":{
"should": [
{ "match":{ "stdAddress": "匹"}},
{ "match":{ "stdAddress": "纽约"}}
],
"minimum_should_match": 1
}
}
}
此操作表明should的条件至少匹配一个
get /otp_aap_addr_detail_info_2019_06/_doc/_search
{
"query": {
"bool":{
"should": [
{ "match":{ "stdAddress": "海"}},
{ "match":{ "stdAddress": "纽约"}}
],
"minimum_should_match": 2
}
}
}
analyzer
用来控制哪个分词器来分析文本数据。默认是根据字段来显示映射定义,或者使用默认的查询分词器。
lenient
设置为true会忽略数据类型不匹配带来的异常。比如将数字字段使用string来查询。缺省是false。
Fuzziness参数用来基于字段的模糊匹配。
控制模糊匹配过程可以通过 prefix_length
和
max_expansions参数的设置来实现。如果模糊选项被设置。查询会使用top_terms_blended_freqs_${max_expansions}作为他的重写方法。fuzzy_rewrite参数允许查询获取重写的方法。
模糊调换(ab->ba)默认是被允许的。如果fuzzy_transpositions设置为false就会失效。
注意:模糊匹配不能用于terms。Terms是一种特殊的查询它不支持关于模糊的相关扩展。
get /otp_aap_addr_detail_info_2019_06/_doc/_search
{
"query": {
"match":{
"stdAddress":{
"query" :"第十",
"fuzziness":0
} }
}
}
match查询
该查询讲query参数中的值拿出来加以分析,然后构建相应的查询
布尔值查匹配查询
{
"query":{
"match":{
"title":{
"query" :"crime and punishment",
"operator":"and" -- 连接创建布尔条件的运算符默认or
"analyzer" :"", -- 分析器的名字
"fuzziness":"", -- 构建模糊查询
"prefix_length", -- 控制模糊查询的行为
"max_expansions", -- 同上
"zero_terms_query" -- 指定当所有的词条都被分析器移除时,查询的行为。可以为all或者none。默认后者
不反悔或者返回所有文档
"cutoff_frequency" -- 将查询分解成两组,一组高频一组低频
}
}
}
}
如果在查询中analyzer去掉所有的token那就相当于取消了过滤功能。缺省的行为是匹配不到任何数据。为了改善这种情况可以使用zero_terms_query选项,他可以接受none或者all与match_all一起协作。
GET /_search
{
"query": {
"match" : {
"message" : {
"query" : "to be or not to be",
"operator" : "and",
"zero_terms_query": "all"
}
}
}
}
官方给的是match查询,改了match_all查询报错了。
Match查询支持cutoff_frequency,这会允许显示的指定一个文档频率。高频词组被进入可选子查询,仅有高频词组被打分。在这种指定文档频率的情况下,低频词组在就会被匹配到
查询功能允许在执行的时候动态处理stopwords。这是一个独立的领域不需要一个停止词汇文件。他会组织搜索高频词汇只将低频无意义的词汇匹配出对应文档。如果查询指定了cutoff_frequency。他会被默认转化为and查询来加快执行。
cutoff_frequency既与数据总数相关也与执行的数字范围有关[0..1)或者比1大。
GET /_search
{
"query": {
"match" : {
"stdAddress" : {
"query" : "华徐公路3029",
"cutoff_frequency" : 0.03
}
}
}
}
把这个改为"cutoff_frequency" : 0.001会有更多的搜索到低频数据。
cutoff_frequency
在shard层级上执行。在尝试执行这些脚本在测试index的时候由于数据量会比较少下面的链接会有一些建议。
https://www.elastic.co/guide/en/elasticsearch/guide/master/relevance-is-broken.html
Match支持多个term的同义词扩展。当过滤器使用的时候。分词器为每一个multi-terms同义词创建查询。
GET /_search
{
"query": {
"match" : {
"message": {
"query" : "ny city",
"auto_generate_synonyms_phrase_query" : false
}
}
}
}
同义词需要提前创建。上面的条件语句翻译为:(ny OR (new AND york)) city)
auto_generate_synonyms_phrase_query
这个参数默认为true
同义词创建学习文档
https://www.elastic.co/guide/en/elasticsearch/reference/6.2/analysis-synonym-graph-tokenfilter.html
与query_string/字段的比较
Match家族的查询不适用"query parsing"程序。它不支持前缀查询,贪心匹配,或者其他高级特性。正是由于查询的准确性比较高,并且它分析和执行文本查询的时候非常优秀(这些操作自文本查询盒子中执行)。phrase_prefix
类型提供优秀的查询操作来加载查询数据。