【问题标题】:Elastic search - no hit though there should be result弹性搜索 - 虽然应该有结果但没有命中
【发布时间】:2016-04-15 11:28:05
【问题描述】:

我在使用 Elastic 搜索时遇到了以下问题,有人知道我应该在哪里解决问题吗?

我很高兴通过以下查询检索结果: {

"query" : {
    "match" : { "name" : "A1212001" }
}

}

但是当我将搜索字段“name”的值细化为子字符串时,我不是没有命中吗? {

"query" : {
    "match" : { "name" : "A12120" }
}

}

“A12120”是已命中查询“A1212001”的子字符串

【问题讨论】:

  • 你要搜索A12120*??
  • 我使用的版本是:elasticsearch-2.3.1

标签: elasticsearch


【解决方案1】:

如果你没有太多文件,你可以用regexp query

POST /index/_search
{
  "query" :{
    "regexp":{
        "name": "A12120.*"
    }
  }
}

甚至是wildcard one

POST /index/_search
{
  "query": {
    "wildcard" : { "name" : "A12120*" }
  }
}

但是,正如@Waldemar 建议的那样,如果您的索引中有很多文档,最好的方法是使用EdgeNGram tokenizer,因为上述查询不是超高性能的。

首先,您可以像这样定义索引设置:

PUT index
{
    "settings" : {
        "analysis" : {
            "analyzer" : {
                "my_analyzer" : {
                    "type": "custom",
                    "tokenizer" : "edge_tokens",
                    "filter": ["lowercase"]
                }
            },
            "tokenizer" : {
                "edge_tokens" : {
                    "type" : "edgeNGram",
                    "min_gram" : "1",
                    "max_gram" : "10",
                    "token_chars": [ "letter", "digit" ]
                }
            }
        }
    },
    "mappings": {
        "my_type": {
            "properties": {
                "name": {
                    "type": "string",
                    "analyzer": "my_analyzer",
                    "search_analyzer": "standard"
                }
            }
        }
    }
}

然后,在索引名称字段包含A1212001的文档时,将索引以下标记:AA1A12A121A1212A12120、@987654337 @,A1212001。因此,当您搜索 A12120 时,您会找到匹配项。

【讨论】:

  • 谢谢,这有帮助。如果我创建自定义分析器,这样子字符串的所有排列都被标记化,会不会很糟糕?例如A, A1, A12, A121, A1212, A12120, A121200, A1212001, 1, 12, 121, 1212.... '因为我想做子字符串匹配,只要字段包含我的查询字符串,那么它应该被击中。
  • 不用担心,在这种情况下只需使用nGram 而不是edgeNGram,它还会索引所有子字符串。这是正确的方法。
【解决方案2】:

您是否使用Match Query 此查询将检查 lucene 中的术语,并且您的术语是 A1212001 如果您需要查找术语的一部分,您可以使用 Regex Query 但您需要知道使用正则表达式会产生一些内部影响,因为分片会检查您的所有条款。

如果您需要更“专业”的方式来搜索某个术语的一部分,您可以使用NGrams

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-15
    • 2015-06-16
    • 1970-01-01
    • 2019-03-15
    • 2019-03-02
    • 2019-06-20
    • 1970-01-01
    • 2018-08-20
    相关资源
    最近更新 更多