Elasticsearch - 使用通配符搜索 [英] Elasticsearch - Search with wildcards

查看:50
本文介绍了Elasticsearch - 使用通配符搜索的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经使用这个批量请求成功地用 4 个文档填充了我的索引:

I've managed to populate my index with 4 documents using this bulk request:

POST localhost:9200/titles/movies/_bulk

{"index":{"_id":"1"}}
{"id": "1","level": "first","titles": [{"value": "The Bad and the Beautiful","type": "Catalogue","main": true},{"value": "The Bad and the Beautiful (1945)","type": "International","main": false}]}
{"index":{"_id":"2"}}
{"id": "2","level": "first","titles": [{"value": "Bad Day at Black Rock","type": "Drama","main": true}]}
{"index":{"_id":"3"}}
{"id": "3","level": "second","titles": [{"value": "Baker's Wife","type": "AnotherType","main": true},{"value": "Baker's Wife (1940)","type": "Trasmitted","main": false}]}
{"index":{"_id":"4"}}
{"id": "4","level": "second","titles": [{"value": "Bambi","type": "Educational","main": true},{"value": "The Baby Deer and the hunter (1942)","type": "Fantasy","main": false}]}

现在如何使用通配符对所有可用的标题进行搜索?

Now how can I perform searches with wildcards on all available titles?

有点像localhost:9200/titles/movies/_search?q=*&sort=level:asc但提供一个或多个通配符.例如搜索The % the %"并解析来自elasticsearch的响应以最终返回如下内容:

Something like localhost:9200/titles/movies/_search?q=*&sort=level:asc but providing one or more wilcards. For instance searching for "The % the %" and parsing the response from elasticsearch to eventually return something like:

{
    "count":2,
    "results":[{
        "id":"1",
        "level":"first",
        "foundInTitleTypes":["Catalogue","International"]
    },{
        "id":"4",
        "level":"second",
        "foundInTitleTypes":["Fantasy"]
    }]
}

谢谢!

推荐答案

Elasticsearch 在正则匹配查询中提供正则表达式支持

Elasticsearch provides regex support in the the regular match query

GET titles/movies/_search
{
    "query": {
        "match" : { "titles.value" : "The * the *" }
    }
}

给你这个

{
  "took": 4,
  "timed_out": false,
  "_shards": {
    "total": 5,
    "successful": 5,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": 1.6406528,
    "hits": [
      {
        "_index": "titles",
        "_type": "movies",
        "_id": "4",
        "_score": 1.6406528,
        "_source": {
          "id": "4",
          "level": "second",
          "titles": [
            {
              "value": "Bambi",
              "type": "Educational",
              "main": true
            },
            {
              "value": "The Baby Deer and the hunter (1942)",
              "type": "Fantasy",
              "main": false
            }
          ]
        }
      },
      {
        "_index": "titles",
        "_type": "movies",
        "_id": "1",
        "_score": 0.9026783,
        "_source": {
          "id": "1",
          "level": "first",
          "titles": [
            {
              "value": "The Bad and the Beautiful",
              "type": "Catalogue",
              "main": true
            },
            {
              "value": "The Bad and the Beautiful (1945)",
              "type": "International",
              "main": false
            }
          ]
        }
      }
    ]
  }
}

要更新您的问题 URI 搜索,我不确定是否可行,如果您使用 curl 进行此操作,则只需省略查询 dsl 作为数据

To update to your question URI search, I'm not sure if it is possible, if you do it with curl you just omit the query dsl as data

curl localhost:9200/titles/movies/_search -d '{"query":{"match":{"titles.value":"The * the *"}}}'

{"took":46,"timed_out":false,"_shards":{"total":5,"successful":5,"failed":0},"hits":{"total":2,"max_score":1.6406528,"hits":[{"_index":"titles","_type":"movies","_id":"4","_score":1.6406528,"_source":{"id": "4","level": "second","titles": [{"value": "Bambi","type": "Educational","main": true},{"value": "The Baby Deer and the hunter (1942)","type": "Fantasy","main": false}]}},{"_index":"titles","_type":"movies","_id":"1","_score":0.9026783,"_source":{"id": "1","level": "first","titles": [{"value": "The Bad and the Beautiful","type": "Catalogue","main": true},{"value": "The Bad and the Beautiful (1945)","type": "International","main": false}]}}]}}

<小时>

更新到最新问题:

好吧,如果你想按级别排序,你需要为elasticsearch提供一个映射.我做了什么:


Update to latest question:

Well if you want to sort by level, you need to provide a mapping for elasticsearch. What I did:

删除索引

DELETE titles

添加映射

PUT titles
{
  "settings": {
    "number_of_shards": 1
  }, 
  "mappings": {
    "movies": {
      "properties": {
        "level": {
          "type": "keyword"
        }
      }
    }
  }
}

细化查询 DSL

GET titles/movies/_search
{
  "_source": [
    "id",
    "level",
    "titles.value"
  ],
  "sort": [
    {
      "level": {
        "order": "asc"
      }
    }
  ],
  "query": {
    "match": {
      "titles.value": "The * the *"
    }
  }
}

这给了我

{
  "took": 4,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "failed": 0
  },
  "hits": {
    "total": 2,
    "max_score": null,
    "hits": [
      {
        "_index": "titles",
        "_type": "movies",
        "_id": "1",
        "_score": null,
        "_source": {
          "level": "first",
          "id": "1",
          "titles": [
            {
              "value": "The Bad and the Beautiful"
            },
            {
              "value": "The Bad and the Beautiful (1945)"
            }
          ]
        },
        "sort": [
          "first"
        ]
      },
      {
        "_index": "titles",
        "_type": "movies",
        "_id": "4",
        "_score": null,
        "_source": {
          "level": "second",
          "id": "4",
          "titles": [
            {
              "value": "Bambi"
            },
            {
              "value": "The Baby Deer and the hunter (1942)"
            }
          ]
        },
        "sort": [
          "second"
        ]
      }
    ]
  }
}

这篇关于Elasticsearch - 使用通配符搜索的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆