当前位置: 首页 > 知识库问答 >
问题:

UUID的弹性搜索Ngram标记器性能

翟修永
2023-03-14

最大ngram 36

在速度和内存方面,这会得到真正糟糕的加班吗?有没有更好的方法来部分搜索UUID?例如,我有7e222584-0818-49b0-875b-2774f4bf939b,我希望能够使用9b0搜索它

共有1个答案

阴高寒
2023-03-14

是的,这将为每个UUID创建大量的令牌,实际上是36+35+34+33+...+1=(1+36)*(36/2)=666个令牌,这是不鼓励的。即使在创建ngram令牌筛选器时,min和max之间的默认可接受距离也是1,因此您必须在索引设置中重写该距离,这给出了一个第一个指示,即这可能不是正确的做法。

您可能想尝试一下新的通配符查询字段,这可能会做得更好。

您可以通过创建两个索引并在两个索引中索引相同数量(但相当大的数量)的UUID,然后比较它们的大小来轻松地比较这两种方法。

PUT uuid1
{
  "settings": {
    "index.max_ngram_diff": 36,
    "analysis": {
      "analyzer": {
        "uuid": {
          "tokenizer": "keyword",
          "filter": [
            "ngram"
          ]
        }
      },
      "filter": {
        "ngram": {
          "type": "ngram",
          "min_gram": 1,
          "max_gram": 36
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "uuid": {
        "type": "text",
        "analyzer": "uuid",
        "search_analyzer": "standard"
      }
    }
  }
}
PUT uuid2
{
  "mappings": {
    "properties": {
      "uuid": {
        "type": "wildcard"
      }
    }
  }
}

然后在以下两个中索引相同的数据:

POST _bulk/_doc
{ "index": {"_index": "uuid1"}}
{ "uuid": "7e222584-0818-49b0-875b-2774f4bf939b"}
{ "index": {"_index": "uuid2"}}
{ "uuid": "7e222584-0818-49b0-875b-2774f4bf939b"}

最后,您可以比较它们的大小,您可以看到UUID索引将大于UUID2索引。这里是3倍,但您可能需要索引更多的数据,以得出更好的比率:

GET _cat/shards/uuid*?v

index shard prirep state   docs  store ip          node
uuid1 0     p      STARTED    1 10.6kb 10.0.33.86  instance-0000000062
uuid2 0     p      STARTED    1  3.5kb 10.0.12.26  instance-0000000042

利用通配符在第二个索引上进行搜索,可以像下面这样非常容易地完成,因此它就像使用ngrams在索引上进行match查询一样简单:

POST uuid2/_search
{
  "query": {
    "wildcard": {
      "uuid": "*9b0*"
    }
  }
}
 类似资料:
  • 我使用ElasticSearch对数据库进行索引。我试图使用edgeNGram标记器切割字符串,以射出要求“新字符串必须长于4个字符”的字符串。我使用以下代码创建索引: 现在我运行test来查看结果 并得到结果

  • 我正在使用edge ngram标记器来提供部分匹配。我的文件看起来像 我的映射如下 以下查询给了我3个正确的文档(,,) 但是当我输入时,它会给我0个文档 我希望这将返回1个文档,但出于某种原因,它似乎没有索引令牌中的数字。让我知道,如果我错过了什么东西在这里。

  • 实现此功能的推荐方法是什么?注意,我使用的是查询字符串查询。

  • 我有以下格式的弹性搜索文档 } } 我的要求是,当我搜索特定字符串(string.string)时,我只想获得该字符串的FileOffSet(string.FileOffSet)。我该怎么做? 谢谢

  • 当我执行ps-aef grep elasticsearch HeapDumpOnOutOfMemoryError时看到了这一点 501 373 47 1 0 2:29pm ttys004 0:04.14/usr/bin/Java-xms4g-xmx4g-xss256k-djava.awt.headless=true-xx:+useparnewgc-xx:+useparnewgc-xx:+usepa

  • 我从ElasticSearch得到以下错误。 我在Ubuntu上运行Elasticsearch 1.7.2。 我做错了什么?