ElasticSearch初探之所有初次使用记录(五)词项/术语检索和跨度查询

词项/术语检索

term、terms、range、prefix略

注意range中的dateformat和时区查询

wildcard(通配符查询)

wildcard查询允许在要查询的内容中使用通配符*和?

# wildcard
POST /chinese_data/poi/_search?pretty
{
    "query": {
        "wildcard": {
          "street": {
            "value": "林浦 * ",
            "boost": 2
          }
        }
}
}

exists(非空值查询)

  • 返回字段中有值的文档,也就是说,字段值仅仅为null的,不返回
# exists
POST /chinese_data/poi/_search?pretty
{
    "query": {
        "exists":{
          "field":"street"
        }
}
}
  • 如果mapping中配置了null_value,则可以为null值设置默认值,但是检索时可用null过滤【所以null_value的值不要指定得太普通】
"user": {
    "type": "keyword",
    "null_value": "_null_"
  }
  • 没有提供missing类似功能的api,但是我们可以将exists与bool查询里的must_not结合来实现相同的功能。
# like missing
POST /chinese_data/poi/_search?pretty
{
    "query": {
      "bool": {
        "must_not": {
          "exists":{
          "field":"street"
          }
        }
     }
  }
}

regexp(正则查询)

regexp查询的性能很大程度上取决于所选的正则表达式。匹配.*非常慢,以及使用lookaround正则表达式。如果可以的话,你应该尝试在正则表达式之前使用尽量长的前缀。通配符匹配器.*?+会大大降低性能

# regexp
POST /bank/account/_search
{
  "_source": {  
    "includes" : [
      "address",
      "email"
    ]
  },
  "from":0,
  "size": 20,
  "query": {
    "regexp":{
      "address":{
        "value":"171........Avenue",
        "boost":2
      }
    }
  }
}

还可以使用Lucen中的RegExp Class中的flags标志
elasticsearch中的正则执行结果与我想象的有很大的差距,不知道是不是与数据mapping有关?总之,我在RegexPal上测试通过的正则很多不能运行

这里有一份对官方doc的翻译
TODO

Fuzzy(模糊查询)

模糊查询使用基于Levenshtein edit distance 的相似度
在指定的最大的edit distance内,模糊查询生成所有可能匹配的terms,然后在索引中确实存在的,并返回
可使用”boost”、”fuzziness”、”prefix_length” 、”max_expansions”等参数

  • fuzziness最好指定为AUTO
  • prefix_length,不会被“模糊化”的初始字符的数量。这有助于减少必须检查的术语数量。默认为0。【设置为0的话,查询会比较慢】
  • max_expansions,模糊查询将扩展到的最大条数。默认为50。【不要设得过大】

模糊查询的顺序是可变的,也就是说,你查询ABCD,CDAB***等等也会匹配

# fuzzy
GET /bank/account/_search
{
    "query": {
        "fuzzy" : {
            "lastname" : {
                "value" :         "ay",
                    "boost" :         1.0,
                    "fuzziness" :     3,
                    "prefix_length" : 0,
                    "max_expansions": 100
            }
        }
    }
}

跨度查询

Span Query跨度查询,是基于Lucene中的SpanTermQuery封装出的DSL。
除span_multi之外,其他的跨度查询不能与非跨度查询一起使用。

span_term

单独使用时,感觉和term是一样的功能。

# span_term

GET /chinese_data/poi/_search
{
    "query": {
        "span_term" : { 
          "citycode" : {
          "value": "21",
          "boost": 2
        } }
    }
}

span_or

span_or匹配多个span_term的并集,实现Lucen的SpanOrQuery。
注意多个span_term的filed必须相同

GET /chinese_data/poi/_search?pretty
{
    "query": {
      "span_or": {
        "clauses": [
          {
            "span_term": {
              "number": {
                "value": "210号"
              }
            }
          },
          {
            "span_term": {
              "number": {
                "value": "1118号"
              }
            }
          }
        ]
      }
    }
}

span_not

  • 这个查询就是排除的意思。有几个属性,include用于定义包含的span查询;exclude用于定义排除的span查询
  • include 和 exclude中的语句可以是span中的任意一种查询
curl -X GET "localhost:9200/_search" -H 'Content-Type: application/json' -d'
{
    "query": {
        "span_not" : {
            "include" : {
                "span_term" : { "field1" : "hoya" }
            },
            "exclude" : {
                "span_near" : {
                    "clauses" : [
                        { "span_term" : { "field1" : "la" } },
                        { "span_term" : { "field1" : "hoya" } }
                    ],
                    "slop" : 0,
                    "in_order" : true
                }
            }
        }
    }
}
'

pre、post、dist参数暂时不理解

span_containing

  • 这个查询内部有little和big子查询,仅返回big匹配的结果中包含little的匹配结果的结果。比方说,big检索条件为”路漫漫”,匹配出“路漫漫其修远兮”和“路漫漫路漫漫”,little条件为“其修远兮”,匹配出“其修远兮”,那么返回“路漫漫其修远兮”。
  • little和big中可以使用各种span查询
GET /_search
{
    "query": {
        "span_containing" : {
            "little" : {
                "span_term" : { "field1" : "foo" }
            },
            "big" : {
                "span_or" : {
                    "clauses" : [
                        { "span_term" : { "field1" : "bar" } },
                        { "span_term" : { "field1" : "baz" } }
                    ],
                    "slop" : 5,
                    "in_order" : true
                }
            }
        }
    }
}

TODO

1.对elasticsearch的regexp的正确操作
2.fuzzy查询”fuzziness”、”prefix_length” 、”max_expansions”三个参数的正确理解’
3.span_not中的pre、post、dist参数

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值