2017-03-05 237 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