Elasticsearch - 使用 "tags" 索引来发现给定字符串中的所有标签
Elasticsearch - use a "tags" index to discover all tags in a given string
我有一个 elasticsearch v2.x 集群,其 "tags" 索引包含大约 5000 个标签:{tagName, tagID}
。给定一个字符串,是否可以查询标签索引以获取在该字符串中找到的所有标签?我不仅想要精确匹配,而且我还希望能够控制模糊匹配而不是过于慷慨。太慷慨了,只有当标签中的所有标记都在彼此一定的接近范围内(比如 5 个词)时,标签才应该匹配。
例如,给定字符串:
Model 22340 Sound Spectrum Analyzer
以下标签应匹配:
sound analyzer
sound
spectrum
analyzer
但不是
sound meter
light spectrum
chemical analyzer
"query": {
"match": {
"tagName": {
"query": "Model 22340 Sound Spectrum Analyzer",
"fuzziness": "AUTO",
"operator": "or"
}
}
}
如果您想要 相等 匹配以使 "sound meter"
不匹配,您必须为每个添加另一个字段在标签名称中包含术语计数的标签,添加一个脚本来计算查询中的术语并在 match_query 中添加两者的比较,请参阅:Finding Multiple Exact Values.
关于接近度问题:由于您需要 "Fuzzyness" 您无法控制接近度,因为 "match_phrase"
查询未与 Fuzzyness 集成,如 Elastic 文档 Fuzzy-match-query 所述:
Fuzziness works only with the basic match and multi_match queries. It doesn’t work with phrase matching, common terms, or cross_fields matches.
所以你需要决定:模糊与接近。
当然可以。您只需使用 standard
分析器匹配查询即可实现您想要的结果。
curl -XGET "http://localhost:9200/tags/_search?pretty" -d '{
"query": {
"match" : {
"tagName" : "Model 22340 Sound Spectrum Analyzer"
}
}
}'
我认为不可能创建一个准确的 elasticsearch 查询来自动标记随机字符串。这基本上是一个反向查询。将标签与文档匹配的最准确方法是为标签构建查询,然后搜索文档。显然,如果您需要遍历每个标签来自动标记文档,这将是非常低效的。
要进行反向查询,您想使用 Elasticsearch Percolator API:
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-percolate.html
API 非常灵活,允许您对具有多个字段的文档创建相当复杂的查询。
基本概念是这样的(假设您的标签有一个特定于应用程序的 ID 字段):
为每个标签创建一个查询,并使用过滤器注册查询(使用标签的 ID 字段)。
要自动标记一个字符串,将您的字符串(作为文档)传递给 Percolator,它将与所有已注册的查询进行匹配。
遍历匹配项。每个匹配项都包含查询的 _id。使用 _id 引用标签。
这也是一篇值得阅读的文章:https://www.elastic.co/blog/percolator-redesign-blog-post
我有一个 elasticsearch v2.x 集群,其 "tags" 索引包含大约 5000 个标签:{tagName, tagID}
。给定一个字符串,是否可以查询标签索引以获取在该字符串中找到的所有标签?我不仅想要精确匹配,而且我还希望能够控制模糊匹配而不是过于慷慨。太慷慨了,只有当标签中的所有标记都在彼此一定的接近范围内(比如 5 个词)时,标签才应该匹配。
例如,给定字符串:
Model 22340 Sound Spectrum Analyzer
以下标签应匹配:
sound analyzer
sound
spectrum
analyzer
但不是
sound meter
light spectrum
chemical analyzer
"query": {
"match": {
"tagName": {
"query": "Model 22340 Sound Spectrum Analyzer",
"fuzziness": "AUTO",
"operator": "or"
}
}
}
如果您想要 相等 匹配以使 "sound meter"
不匹配,您必须为每个添加另一个字段在标签名称中包含术语计数的标签,添加一个脚本来计算查询中的术语并在 match_query 中添加两者的比较,请参阅:Finding Multiple Exact Values.
关于接近度问题:由于您需要 "Fuzzyness" 您无法控制接近度,因为 "match_phrase"
查询未与 Fuzzyness 集成,如 Elastic 文档 Fuzzy-match-query 所述:
Fuzziness works only with the basic match and multi_match queries. It doesn’t work with phrase matching, common terms, or cross_fields matches.
所以你需要决定:模糊与接近。
当然可以。您只需使用 standard
分析器匹配查询即可实现您想要的结果。
curl -XGET "http://localhost:9200/tags/_search?pretty" -d '{
"query": {
"match" : {
"tagName" : "Model 22340 Sound Spectrum Analyzer"
}
}
}'
我认为不可能创建一个准确的 elasticsearch 查询来自动标记随机字符串。这基本上是一个反向查询。将标签与文档匹配的最准确方法是为标签构建查询,然后搜索文档。显然,如果您需要遍历每个标签来自动标记文档,这将是非常低效的。
要进行反向查询,您想使用 Elasticsearch Percolator API:
https://www.elastic.co/guide/en/elasticsearch/reference/current/search-percolate.html
API 非常灵活,允许您对具有多个字段的文档创建相当复杂的查询。
基本概念是这样的(假设您的标签有一个特定于应用程序的 ID 字段):
为每个标签创建一个查询,并使用过滤器注册查询(使用标签的 ID 字段)。
要自动标记一个字符串,将您的字符串(作为文档)传递给 Percolator,它将与所有已注册的查询进行匹配。
遍历匹配项。每个匹配项都包含查询的 _id。使用 _id 引用标签。
这也是一篇值得阅读的文章:https://www.elastic.co/blog/percolator-redesign-blog-post