在ElasticSearch中使用Analyzer进行部分搜索

时间:2013-07-30 06:45:54

标签: elasticsearch

我正在使用elasticsearch构建网址索引。

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

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

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

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

我搜索时是否可以使用“Analyzer”,即使我在编制索引时没有使用“Analyzer”?

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

非常感谢。

2 个答案:

答案 0 :(得分:5)

2种方法:

1。通配符搜索 - 简单快捷

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

2。使用nGram tokenizer - 更难但更快

索引设置

"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"
    }
}

答案 1 :(得分:-1)

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

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