最大ngram 36
在速度和内存方面,这会得到真正糟糕的加班吗?有没有更好的方法来部分搜索UUID?例如,我有7e222584-0818-49b0-875b-2774f4bf939b,我希望能够使用9b0搜索它
是的,这将为每个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。 我做错了什么?