【问题标题】:Is there a way to get ElasticSearch to create n-gram tokens from truncated field?有没有办法让 ElasticSearch 从截断字段创建 n-gram 令牌?
【发布时间】:2021-11-13 07:42:57
【问题描述】:

文档包含一个带有完整 url 的 url 字段。用户应该能够通过提供部分 url 字符串来搜索包含给定 url 的文档。搜索字符串的长度可以是 3-15 个字符。 min_gram 为 3 和 max_gram 为 15 的 N-gram 标记过滤器可以工作,但会为长 url 生成大量标记。是否可以让 ElasticSearch 只为 url 字段的前 100 个字符生成令牌?

例如,用户应该能够使用诸如“example.com”或“/foo/bar”之类的搜索字符串来搜索包含以下网址的文档。

https://click.example.com/foo/bar/55gft/?qs=1952934d0ee8e2368ec7f7a921e3c6202b39365b9a2d26774c8122b8555ca21fce9d2344fc08a8ba40caede5e6901a112c6e89ead40892109eb8290d70571eab

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

    有两种方法可以实现你想要的。

    选项 1: 像现在一样继续使用 ngram,但在 ngram 之前插入 truncate token filter,以将 url 大小限制为 100,并且仅在 ngram 之后。

    选项 2:使用专为此类情况创建的 wildcard field type

    在您的索引中,您应该首先将 URL 字段的类型更改为wildcard

    PUT test 
    {
      "mappings": {
        "properties": {
          "url": {
            "type": "wildcard"
          }
        }
      }
    }
    

    然后,您可以使用通配符查询在该字段上进行搜索,如下所示:

    POST test/_search 
    {
      "query": {
        "wildcard": {
          "url": "*foo/bar*"
        }
      }
    }
    

    另外,请阅读related blog post,其中详细显示了wildcard 字段类型的执行情况。

    【讨论】:

      猜你喜欢
      • 2021-06-16
      • 2015-08-12
      • 2020-01-15
      • 1970-01-01
      • 1970-01-01
      • 2015-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多