使用术语的 Elasticsearch 空间搜索
Elasticsearch spatial search with terms
我正在 运行 查询 140 多万份具有空间数据的文档。纯空间查询非常快(低于 1 秒)。向相同几何体添加通配符会导致查询耗时约 10-20 秒。我预计通配符查询需要一些时间,但我想知道是否有更好的方法来编写查询或欺骗 Elasticsearch 将结果过滤为仅几何图形,然后找到通配符匹配项。或者,也许 运行 空间查询然后 运行 结果文档 ID 上的通配符?任何可能为最终用户带来更快结果的想法都将不胜感激。
GET parcels/_search
{
"query": {
"bool": {
"must": [
{
"wildcard": {
"name.keyword": {
"value": "*smith*"
}
}
},
{
"bool": {
"filter": [
{
"geo_shape": {
"shape": {
"shape": {
"type": "POLYGON",
"coordinates": [
[
[
-81.09980486601305,
32.063655184739936
],
[
-81.09980486601168,
32.05639855631687
],
[
-81.09128330779276,
32.05639855631687
],
[
-81.09128330779276,
32.06365489826756
],
[
-81.09980486601305,
32.063655184739936
]
]
]
},
"relation": "intersects"
}
}
}
]
}
}
]
}
},
"size": 10000
}
我们的索引设置:
{
...
"analysis": {
"normalizer": {
"search_normalizer": {
"filter": [
"uppercase"
],
"type": "custom"
}
}
},
"number_of_shards": 8,
"number_of_replicas": 1,
'name' 字段的映射:
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"normalizer": "search_normalizer"
}
}
},
运行 ES 7.10。 (5 个节点,每个节点具有 8GB RAM)
不按通配符搜索不是一个选项。
感谢任何帮助。
在 keyword
字段上使用带前缀通配符(如 *smith*
)的通配符搜索会降低性能!
如果您绝对需要这种功能,则需要利用新的 wildcard
field type,它正是为这种用途而设计的。
因此您可以添加另一个子字段或将 keyword
子字段更改为 ?wildcard` 子字段。
您可以在 blog article 中看到它是如何工作的,在它出现时描述了通配符字段。
我正在 运行 查询 140 多万份具有空间数据的文档。纯空间查询非常快(低于 1 秒)。向相同几何体添加通配符会导致查询耗时约 10-20 秒。我预计通配符查询需要一些时间,但我想知道是否有更好的方法来编写查询或欺骗 Elasticsearch 将结果过滤为仅几何图形,然后找到通配符匹配项。或者,也许 运行 空间查询然后 运行 结果文档 ID 上的通配符?任何可能为最终用户带来更快结果的想法都将不胜感激。
GET parcels/_search
{
"query": {
"bool": {
"must": [
{
"wildcard": {
"name.keyword": {
"value": "*smith*"
}
}
},
{
"bool": {
"filter": [
{
"geo_shape": {
"shape": {
"shape": {
"type": "POLYGON",
"coordinates": [
[
[
-81.09980486601305,
32.063655184739936
],
[
-81.09980486601168,
32.05639855631687
],
[
-81.09128330779276,
32.05639855631687
],
[
-81.09128330779276,
32.06365489826756
],
[
-81.09980486601305,
32.063655184739936
]
]
]
},
"relation": "intersects"
}
}
}
]
}
}
]
}
},
"size": 10000
}
我们的索引设置:
{
...
"analysis": {
"normalizer": {
"search_normalizer": {
"filter": [
"uppercase"
],
"type": "custom"
}
}
},
"number_of_shards": 8,
"number_of_replicas": 1,
'name' 字段的映射:
"name": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"normalizer": "search_normalizer"
}
}
},
运行 ES 7.10。 (5 个节点,每个节点具有 8GB RAM)
不按通配符搜索不是一个选项。
感谢任何帮助。
在 keyword
字段上使用带前缀通配符(如 *smith*
)的通配符搜索会降低性能!
如果您绝对需要这种功能,则需要利用新的 wildcard
field type,它正是为这种用途而设计的。
因此您可以添加另一个子字段或将 keyword
子字段更改为 ?wildcard` 子字段。
您可以在 blog article 中看到它是如何工作的,在它出现时描述了通配符字段。