elasticsearch 无法按单独的术语进行搜索

问题描述 投票:0回答:1

我有一个es文档,如下所示。

{
  "_index" : "trigger",
  "_type" : "_doc",
  "_id" : "urn:trigger:(urn:analyticsplatform:uc4):acxiom_au_attr.done",
  "_version" : 45,
  "_seq_no" : 420508,
  "_primary_term" : 20,
  "found" : true,
  "_source" : {
    "_boostScoreFactor" : 1.0,
    "type" : "trigger",
    "title" : "acxiom_au_attr.done",
  }
}

这是标题字段的映射。

        "title" : {
          "type" : "text",
          "fields" : {
            "keyword" : {
              "type" : "keyword",
              "ignore_above" : 256
            }
          }
        }

它使用一个分析器来分隔标题,并且它会被分成多个术语

{
  "tokens" : [
    {
      "token" : "acxiom",
      "start_offset" : 0,
      "end_offset" : 6,
      "type" : "<ALPHANUM>",
      "position" : 0
    },
    {
      "token" : "au",
      "start_offset" : 7,
      "end_offset" : 9,
      "type" : "<ALPHANUM>",
      "position" : 1
    },
    {
      "token" : "attr",
      "start_offset" : 10,
      "end_offset" : 14,
      "type" : "<ALPHANUM>",
      "position" : 2
    }
    {
      "token" : "done",
      "start_offset" : 19,
      "end_offset" : 23,
      "type" : "<ALPHANUM>",
      "position" : 4
    }
  ]
}

但是我无法使用这个词来搜索它。

GET trigger/_search
{
  "query": {
    "match": {
      "title": "acxiom"
    }
  }
}

如果我使用整个标题,它就可以工作。

GET trigger/_search
{
  "query": {
    "match": {
      "title": "acxiom_au_attr.done"
    }
  }
}

我该怎么做才能使其支持按词搜索?

elasticsearch search full-text-search
1个回答
0
投票

正如我可以检查映射一样,没有指定分析器。因此默认情况下 Elasticsearch 使用标准分析器。

这意味着,如果我使用默认设置插入数据(使用标准分析器),它将创建以下术语:

GET /_analyze?pretty
{
  "analyzer" : "standard",
  "text" : "acxiom_au_attr.done"
}

回应

{
  "tokens": [
    {
      "token": "acxiom_au_attr.done",
      "start_offset": 0,
      "end_offset": 19,
      "type": "<ALPHANUM>",
      "position": 0
    }
  ]
}

它只创建了一个术语,那就是

acxiom_au_attr.done
。这就是为什么它与整个值匹配但不与部分值匹配。

您可以使用简单分析器,它将创建如下所示的术语:

GET /_analyze?pretty
{
  "analyzer" : "simple",
  "text" : "acxiom_au_attr.done"
}

回复

{
  "tokens": [
    {
      "token": "acxiom",
      "start_offset": 0,
      "end_offset": 6,
      "type": "word",
      "position": 0
    },
    {
      "token": "au",
      "start_offset": 7,
      "end_offset": 9,
      "type": "word",
      "position": 1
    },
    {
      "token": "attr",
      "start_offset": 10,
      "end_offset": 14,
      "type": "word",
      "position": 2
    },
    {
      "token": "done",
      "start_offset": 15,
      "end_offset": 19,
      "type": "word",
      "position": 3
    }
  ]
}

创建映射

PUT /test-index2?pretty
{
  "mappings": {
    "properties": {
      "title": {
        "type": "text",
        "analyzer": "simple"
      }
    }
  }
}

插入文档

POST test-index2/_doc
{
  "title":"acxiom_au_attr.done"
}

使用术语搜索

GET test-index2/_search
{
  "query": {
    "match": {
      "title": "acxiom"
    }
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.