我遇到了弹性搜索的以下问题,有谁知道我应该在哪里进行故障排除?
我很高兴使用以下查询检索结果: {
"query" : {
"match" : { "name" : "A1212001" }
}
}
但是当我将搜索字段“name”的值精炼为子字符串时,我不是没有命中? {
"query" : {
"match" : { "name" : "A12120" }
}
}
“A12120”是已命中查询“A1212001”的子字符串
答案 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
的文档编制索引时,以下代币将被编入索引:A
,A1
,A12
,A121
, A1212
,A12120
,A121200
,A1212001
。因此,当您搜索A12120
时,您会找到匹配项。