2017-03-05 179 views
1

短语使用通配符使用通配符,我可以匹配方面开始与一些值:与Elasticsearch查询字符串查询

{ 
    "query": { 
     "query_string" : { 
      "query" : "subject:cell*" 
     } 
    } 
} 

这里subject字段是keyword场(非分析)。这工作正常,但我无法弄清楚如何找到以“蜂窝控制”开始的术语。尝试双引号没有取得预期的结果:

{ 
    "query": { 
     "query_string" : { 
      "query" : "subject:\"cellular contr*\"" 
     } 
    } 
} 

注:短语搜索正常工作与精确匹配,只是没有用通配符。我的猜测是星号不是在双引号内被解释为通配符运算符。那是对的吗?还有什么其他的方式来使用带有短语的通配符运算符吗?

注:我必须使用Query String Query,因为查询来自用户输入。

(我知道我可以诉诸正则表达式,但不希望)

回答

0

试试这个:

{ 
    "query": { 
     "query_string" : { 
      "query" : "subject:"cellular contr*", 
      "split_on_whitespace" : false 
     } 
    } 
} 
+0

默认值为'false',因此将其明确设置为false应该没有任何区别。但我为了以防万一,它被解释为“(subject:cellular)or(contr *)”,而不是我想要的。我也尝试过使用'analyze_wildcard'和'auto_generate_phrase_queries',但没有成功(虽然文档与他们所做的事情有点相似) – danmichaelo

1

编辑: 定义自定义分析仪搜索: -

settings: 
    index: 
    analysis: 
     analyzer: 
     keyword_analyzer: 
      type: custom 
      tokenizer: keyword 
      filter: 
      - lowercase 

发现在这种情况下您需要使用Prefix Query,因为Query String Query始终在空间上分段在解析过程中。

但是由于您在此字段中使用的是lowecase filter,并且前缀查询不支持分析器,因此您必须在将用户输入附加到查询之前将其小写。

新建查询变为: -

{ 
     "query": { 
      "prefix" : { 
       "subject" : "cellular contr" 
      } 
     } 
    } 

或者,你可以使用Match Phrase Query支持分析。

{ 
    "query": { 
     "match_phrase_prefix" : { 
      "subject" : { 
       "query" : "Cellular contr", 
        "analyzer" : "keyword_analyzer", 
        "max_expansions" : 100 
       } 
       } 
     } 
    } 
+0

如果我不需要短语查询,那么这样做会有效。但我不希望查询“cellular contr *”匹配,比如说“控制细胞物质”,这就是为什么我将该字段编入索引为“keyword”的原因。 – danmichaelo

+0

我想我误解了你的问题。是否正确地搜索查询字符串“cellular contr”,并在“未分析”类型的“关键字”类型的字段“subject”中获得“控制多孔材料”的结果? –

+0

不,如果我搜索“细胞控制”,我希望它匹配“细胞控制”,但不是“细胞物质的控制”。所以我想要的是'subject:/ cellular contr。* /',但不使用正则表达式。 – danmichaelo

1

除了定制分析仪Hemed如指出,需要如下做搜索 -

{ 
    "query": { 
     "query_string" : { 
      "query" : "subject:cellular\\ contr*" 
     } 
    } 
} 

了大量的研究和尝试后找到了!

+0

谢谢你的提示! “\\”告诉弹性,它是短语中的空格,并且您可以(或必须)省略搜索字符串的引号。 – SeriousM