gpt4 book ai didi

php - Elasticsearch查找子域

转载 作者:行者123 更新时间:2023-12-02 23:20:16 24 4
gpt4 key购买 nike

我尝试在Elasticsearch中按主域查找子域。
我为 flex 添加了几个域:

 $domains = [
'site.com',
'ns1.site.com',
'ns2.site.com',
'test.main.site.com',
'sitesite.com',
'test-site.com',
];
foreach ($domains as $domain) {
$params = [
'index' => 'my_index',
'type' => 'my_type',
'body' => ['domain' => $domain],
];
$client->index($params);
}

然后我尝试搜索:
$params = [
'index' => 'my_index',
'type' => 'my_type',
'body' => [
'query' => [
'wildcard' => [
'domain' => [
'value' => '.site.com',
],
],
],
],
];
$response = $client->search($params);

但是什么也没发现。 :(

我的映射是:
https://pastebin.com/raw/k9MzjJUM

有什么想法可以解决吗?

谢谢

最佳答案

您快到了,只剩下几件事了。

如何进行“结尾为”查询?

在查询中添加*就足够了(这就是为什么此查询称为 wildcard 的原因):

POST my_index/my_type/_search
{
"query": {
"wildcard" : { "domain" : "*.site.com" }
}
}

这将为您提供以下结果:
{
...
"hits": {
"total": 1,
"max_score": 1,
"hits": [
{
"_index": "my_index",
"_type": "my_type",
"_id": "RoE8VGMBRuo1XmkIXhp0",
"_score": 1,
"_source": {
"domain": "test.main.site.com"
}
}
]
}
}

似乎可行,但我们只能得到其中一个结果(不是全部)。

为什么不返回所有匹配的文档?

返回到您的映射,字段 domain的类型为 text :
PUT my_index
{
"mappings": {
"my_type": {
"properties": {
"domain": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
}
}
}
}
}

这意味着该字段的内容将被标记和小写(使用 standard分析器)。您可以看到使用 _analyze API实际上可以搜索哪些 token ,如下所示:
POST _analyze
{
"text": "test.main.site.com"
}

{
"tokens": [
{
"token": "test.main.site.com",
"start_offset": 0,
"end_offset": 18,
"type": "<ALPHANUM>",
"position": 0
}
]
}

这就是 wildcard查询可以匹配 test.main.site.com的原因。

如果我们采用 n1.site.com怎么办?
POST _analyze
{
"text": "n1.site.com"
}

{
"tokens": [
{
"token": "n1",
"start_offset": 0,
"end_offset": 2,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "site.com",
"start_offset": 3,
"end_offset": 11,
"type": "<ALPHANUM>",
"position": 1
}
]
}

如您所见,没有以 .site.com结尾的 token (请注意 .之前的 site.com)。

幸运的是,您的映射已经能够返回所有结果。

如何返回“结果为”查询的所有结果?

您可以使用 keyword 字段,该字段使用确切的值进行查询:
POST my_index/my_type/_search
{
"query": {
"wildcard" : { "domain.keyword" : "*.site.com" }
}
}

这将为您提供以下结果:
{
"hits": {
"total": 3,
"max_score": 1,
"hits": [
{
"_index": "my_index",
"_type": "my_type",
"_id": "RoE8VGMBRuo1XmkIXhp0",
"_score": 1,
"_source": {
"domain": "test.main.site.com"
}
},
{
"_index": "my_index",
"_type": "my_type",
"_id": "Q4E8VGMBRuo1XmkIFRpy",
"_score": 1,
"_source": {
"domain": "ns1.site.com"
}
},
{
"_index": "my_index",
"_type": "my_type",
"_id": "RYE8VGMBRuo1XmkIORqG",
"_score": 1,
"_source": {
"domain": "ns2.site.com"
}
}
]
}
}

这是进行“以”结尾的查询的最佳方法吗?

其实没有 wildcard查询 can be very slow:

Note that this query can be slow, as it needs to iterate over many terms. In order to prevent extremely slow wildcard queries, a wildcard term should not start with one of the wildcards * or ?.



为了获得最佳性能,在您的情况下,我建议创建另一个字段 higherLevelDomains,并手动从原始字段中提取更高级别的域。该文档可能如下所示:
POST my_index/my_type
{
"domain": "test.main.site.com",
"higherLevelDomains": [
"main.site.com",
"site.com",
"com"
]
}

这将允许您使用 term 查询:
POST my_index/my_type/_search
{
"query": {
"term" : { "higherLevelDomains.keyword" : "site.com" }
}
}

对于这种任务,这可能是使用Elasticsearch可获得的最有效的查询。

希望有帮助!

关于php - Elasticsearch查找子域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50249450/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com