使用Elasticsearch查询字符串查询的短语中的通配符



使用通配符运算符,我可以从某个值开始匹配术语:

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

最新更新