2

我正在使用 elasticsearch 来构建 URL 的索引。

我将一个 URL 提取为 3 个部分,即“域”、“路径”和“查询”。

例如:testing.com/index.html?user=who&pw=no将分成

domain = testing.com
path = index.html
query = user=who&pw=no

当我想在我的索引中部分搜索域时出现问题,例如“user=who”或“ing.com”。

即使我在索引时没有使用“分析器”,是否可以在搜索时使用“分析器”?

如何根据分析器进行部分搜索?

非常感谢你。

4

2 回答 2

6

2种方法:

1.通配符搜索 - 简单而缓慢

"query": {
    "query_string": {
        "query": "*ing.com",
        "default_field": "domain"
    }
}

2. 使用 nGram 分词器 - 更难但更快

索引设置

"settings" : {
    "analysis" : {
        "analyzer" : {
            "my_ngram_analyzer" : {
                "tokenizer" : "my_ngram_tokenizer"
            }
        },
        "tokenizer" : {
            "my_ngram_tokenizer" : {
                "type" : "nGram",
                "min_gram" : "1",
                "max_gram" : "50"
            }
        }
    }
}

映射

"properties": {
    "domain": {
        "type": "string",
        "index_analyzer": "my_ngram_analyzer"
    },
    "path": {
        "type": "string",
        "index_analyzer": "my_ngram_analyzer"
    },
    "query": {
        "type": "string",
        "index_analyzer": "my_ngram_analyzer"
    }
}

查询

"query": {
    "match": {
        "domain": "ing.com"
    }
}
于 2013-07-30T18:46:59.717 回答
-1

查询字符串的技巧是在索引时将字符串拆分"user=who&pw=no"为标记["user=who&pw=no", "user=who", "pw=no"]。这使您可以轻松地进行查询,例如"user=who". 您可以使用 pattern_capture 令牌过滤器来执行此操作,但也可能有更好的方法来执行此操作。

您还可以使用 path_hierarchy 标记器使主机名和路径更易于搜索,例如"/some/path/somewhere"变为["/some/path/somewhere", "/some/path/", "/some"]. 您还可以使用设置reverse: true和使用 path_hierarchy hierarcy tokenizer 索引主机名delimiter: "."。您可能还想使用一些停用词过滤器来排除顶级域。

于 2014-02-21T07:35:54.820 回答