弹性搜索 - 虽然应该有结果但没有命中

时间:2016-04-15 02:40:40

标签: elasticsearch

我遇到了弹性搜索的以下问题,有谁知道我应该在哪里进行故障排除?

我很高兴使用以下查询检索结果: {

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

}

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

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

}

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

2 个答案:

答案 0 :(得分:0)

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

如果您需要更多"专业"搜索某个术语的一部分的方法是否可以使用Regex Query

答案 1 :(得分:0)

如果您没有太多文档,可以使用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的文档编制索引时,以下代币将被编入索引:AA1A12A121A1212A12120A121200A1212001。因此,当您搜索A12120时,您会找到匹配项。