【问题标题】:Partial Search using Analyzer in ElasticSearch在 ElasticSearch 中使用 Analyzer 进行部分搜索
【发布时间】:2013-07-30 06:45:53
【问题描述】:

我正在使用 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”。

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

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

非常感谢。

【问题讨论】:

    标签: elasticsearch


    【解决方案1】:

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

    【讨论】:

    • 如果我不使用“分析器”进行索引,我可以使用“分析器”进行搜索吗?
    • “分析器”不只是一种类型,有很多方法可以做到。简而言之,是的,您可以在搜索到索引时使用不同的分析器。分析获取原始数据并生成令牌。当您搜索查询中的数据时,会分析查询中的数据,并将这些查询标记与索引时创建的标记进行匹配。因此结果取决于索引和搜索分析器。有些搜索无法仅通过搜索时间分析进行,您需要为其设置显式映射。
    【解决方案2】:

    查询字符串的技巧是在索引时将"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: truedelimiter: "." 使用path_hierarchy 层次标记器来索引主机名。您可能还想使用一些停用词过滤器来排除顶级域。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-17
      • 1970-01-01
      • 2017-03-11
      相关资源
      最近更新 更多