使用通配符运算符,我可以从某个值开始匹配术语:
{
"query": {
"query_string" : {
"query" : "subject:cell*"
}
}
}
subject
字段这里是keyword
字段(非分析)。这可以正常工作,但是我不知道如何从"蜂窝contrular"开始找到术语。尝试双引号不会产生预期的结果:
{
"query": {
"query_string" : {
"query" : "subject:"cellular contr*""
}
}
}
注意:短语搜索与确切匹配的效果很好,只是与通配符不是。我的猜测是,恒星没有被解释为双引号中的通配符操作员。那是对的吗?还有其他方法可以使用短语的通配符操作员吗?
注意:我必须使用查询字符串查询,因为查询来自用户输入。
(我知道我可以求助于Regexp,但不愿意)
除了hemed指向的自定义分析仪外,您还需要按下搜索 -
{
"query": {
"query_string" : {
"query" : "subject:cellular\ contr*"
}
}
}
经过大量研究并尝试!
编辑:定义搜索自定义分析仪: -
settings:
index:
analysis:
analyzer:
keyword_analyzer:
type: custom
tokenizer: keyword
filter:
- lowercase
发现在这种情况下,您需要使用前缀查询,因为查询字符串查询在解析过程中总是在空间上的段。
但是,由于您在此字段中使用了lowecase filter
,并且前缀查询不支持分析器,因此您必须在将其附加到查询之前,必须较低较低的用户输入。
新查询变为: -
{
"query": {
"prefix" : {
"subject" : "cellular contr"
}
}
}
另外,您可以使用支持分析仪的匹配短语查询。
{
"query": {
"match_phrase_prefix" : {
"subject" : {
"query" : "Cellular contr",
"analyzer" : "keyword_analyzer",
"max_expansions" : 100
}
}
}
}
尝试以下:
{
"query": {
"query_string" : {
"query" : "subject:"cellular contr*",
"split_on_whitespace" : false
}
}
}