词项/术语检索
term、terms、range、prefix略
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参数