在Elasticsearch中,如何执行带空格的通配符搜索?

时间:2019-03-04 20:24:48

标签: elasticsearch

我目前有一个对象数组,其中包括:

        {
          "key": "party",
          "str_val": "THE TWITTER INC"
        }

        {
          "key": "party",
          "str_val": "twitter inc"
        }

我映射的相关部分是:

          "key": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "str_val": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          }

当我尝试执行通配符匹配时,如下所示:

"wildcard": {
    "metadata.str_val": "*twitter*"
}

两个文档都被返回。但是,如果我修改查询以包含空格:

"wildcard": {
    "metadata.str_val": "*twitter inc*"
}

不返回任何文档。如何使用空格进行通配符搜索?

1 个答案:

答案 0 :(得分:2)

选项1:

在当前映射的情况下,即不使用分析仪的情况下,query_string应该为您工作。

PUT my_index2/doc/1
{
  "key": "party",
  "str_val": "THE TWITTER INC"
}

PUT my_index2/doc/2
{
  "key": "party",
  "str_val": "twitter inc"
}

POST my_index2/_search
{
  "query": {
    "query_string": {
      "default_field": "str_val",
      "query": "*twitter inc*"
    }
  }
}

选项2:

但是,如果要使用wildcard,则需要如下添加自定义分析器:

PUT my_index/
{
  "settings": {
    "analysis": {
      "analyzer": {
        "k_lowercase": {
          "type": "custom",
          "tokenizer": "keyword",
          "filter": [
            "lowercase"
          ]
        }
      }
    }
  },
   "mappings": {
      "doc": {
        "properties": {
          "key": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }              
          },
          "str_val": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            },
             "analyzer":"k_lowercase"
          }
        }
      }
    }
}

现在放置分析器后添加记录:

PUT my_index/doc/1
{
  "key": "party",
  "str_val": "THE TWITTER INC"
}

PUT my_index/doc/2
{
  "key": "party",
  "str_val": "twitter inc"
}

POST my_index/_search
{
  "query": {
    "wildcard": {
      "str_val": {
        "value": "*twitter inc*"
      }
    }
  }
}