我有一个为一些文本生成的minhash字段(基于minhash算法),现在我的问题是,是否有可能以某种方式补充或添加带有通配符的前缀查询?因为问题是,散列字符串值基于带状疱疹/令牌的内容(文本)位置。因此,前几个字符(前缀)可能并不总是完全匹配相似的内容。是否可以在查询的前缀之前添加通配符,例如* 3AF8659GJ?
编辑:我想我不是在想这个问题。散列差异可以是散列字符串中的任何位置(基于文本差异的内容位置中的文本差异)。所以我认为“最好”的唯一方法就是编辑距离和一些阈值。
例如,将所有哈希值放入数组并按词法顺序排序(或者如何对Hex-strings进行排序?)然后只比较下一个k文档,直到达到编辑距离阈值,并将重复项放在一个单独的数组中..
由于性能原因,非常不鼓励使用后缀进行搜索,如official document中所述:
为了防止极慢的通配符查询,通配符术语不应该以通配符*或其中一个开头?
使用精心设计的分析仪仍然可以实现您的目标。想法是仅对minhash的结尾进行索引。你可以按照下面的描述实现它。
首先,使用以下分析器创建索引:
PUT minhash-index
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"suffix": {
"type": "custom",
"tokenizer": "keyword",
"filter": [
"lowercase",
"reverse",
"substring",
"reverse"
]
}
},
"filter": {
"substring": {
"type": "edgeNGram",
"min_gram": 1,
"max_gram": 10
}
}
}
}
},
"mappings": {
"doc": {
"properties": {
"minhash": {
"type": "text",
"analyzer": "suffix",
"search_analyzer": "standard"
}
}
}
}
}
suffix
分析器的想法是,它会为你抛入索引的每个minhash索引长度为1到10的所有后缀(你可以决定索引更长的后缀)。
因此,例如,对于minhash C50FD711C2C43287351892A4D82F44B055F048C46D2C54197AC1D1E921F11E6699C4057C4B93907518E6DCA51A672D3D3E419160DAE276CB7716D11B94D8C3BB2E4A591329B7AF973D17A7F9336342FFAAFD4D
,它将索引以下所有后缀:
d
4d
d4d
fd4d
afd4d
aafd4d
faffd4d
ffaafd4d
2ffaafd4d
42ffaafd4d
然后,您可以使用以下查询轻松搜索并查找上述minhash:
POST minhash-index/_search
{
"query": {
"match": {
"minhash": "42FFAAFD4D"
}
}
}