【问题标题】:Elastic Search_as_you_type case insensitive match弹性 Search_as_you_type 不区分大小写匹配
【发布时间】:2021-06-21 20:18:18
【问题描述】:

我想对 3 个字段执行部分搜索:UUID、tracking_id 和 zip_code。它们只包含 1 个单词,除了 UUID 的连字符外没有特殊字符/空格。 我不确定是否应该使用 search_as_you_type 或 edge ngram tokenizer 或 edge ngram token filter,所以我先尝试了 search_as_you_type。

我已经创建了这个索引:

{
    "settings": {
        "index": {
            "sort.field": [ "created_at", "id" ],
            "sort.order": [ "desc", "desc" ]
        }
    },
    "mappings": {
        "properties": {
            "id": { "type": "keyword", "fields": { "raw": { "type": "search_as_you_type" }}},
            "current_status": { "type": "keyword" },
            "tracking_id":     { "type": "wildcard" },
            "invoice_number":  { "type": "keyword" },
            "created_at":     { "type": "date" }
        }
    }
}

并插入此文档:

{
    "id": "SIGRID",
    "current_status": "unassigned",
    "tracking_id": "AXXH",
    "invoice_number": "xxx",
    "created_at": "2021-03-24T09:36:10.717672467Z"
}

我发送了这个查询:

{"query": {
    "multi_match": {
      "query": "sigrid",
      "type": "bool_prefix",
      "fields": [
        "id"
      ]
    }
  }
}

这不返回结果,但 SIGRID, S, SIG 返回结果。如何使 search_as_you_type 查询不区分大小写?我应该改用边缘 ngram 标记器吗?谢谢

【问题讨论】:

  • 我的错,实际上 search_as_you_type 不区分大小写,我只需要输入字段:id.raw 或根本不输入字段

标签: elasticsearch indexing tokenize


【解决方案1】:

您可以使用小写过滤器定义自定义规范器,小写过滤器将确保在索引文档和搜索之前将所有字母更改为小写。修改你的索引映射为

{
  "settings": {
    "index": {
      "sort.field": [
        "created_at",
        "id"
      ],
      "sort.order": [
        "desc",
        "desc"
      ]
    },
    "analysis": {
      "normalizer": {
        "my_normalizer": {
          "type": "custom",         // note this
          "filter": [
            "lowercase"
          ]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "id": {
        "type": "keyword",
        "normalizer": "my_normalizer",       // note this
        "fields": {
          "raw": {
            "type": "search_as_you_type"
          }
        }
      },
      "current_status": {
        "type": "keyword"
      },
      "tracking_id": {
        "type": "wildcard"
      },
      "invoice_number": {
        "type": "keyword"
      },
      "created_at": {
        "type": "date"
      }
    }
  }
}

搜索查询:

{
  "query": {
    "multi_match": {
      "query": "sigrid",
      "type": "bool_prefix"
    }
  }
}

搜索结果:

"hits": [
      {
        "_index": "66792606",
        "_type": "_doc",
        "_id": "1",
        "_score": 2.0,
        "_source": {
          "id": "SIGRID",
          "current_status": "unassigned",
          "tracking_id": "AXXH",
          "invoice_number": "xxx",
          "created_at": "2021-03-24T09:36:10.717672467Z"
        }
      }
    ]

【讨论】:

  • 你的意思是因为我用于部分搜索的字段只有1个词,我不需要使用边n克吗?在阅读了许多教程后,我感到困惑并导致了我认为的错误方向
  • 如果我已经使用了那个分析器,为什么还要使用字段类型search_as_you_type??
  • @nanakondor 对于上述用例,您也可以使用 edge ngram。但是如果你也想搜索小写,那么你需要使用normalizer,如上面的索引映射所示
  • @nanakondor 如果您想了解更多有关search_as_you_type 字段如何工作的信息,请参考此答案stackoverflow.com/a/64273804/10348758
  • 我的错,实际上 search_as_you_type 不区分大小写,我只需要输入字段:id.raw 或根本不输入字段
猜你喜欢
  • 2016-08-03
  • 1970-01-01
  • 2017-11-14
  • 2012-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-19
相关资源
最近更新 更多