2013-02-09 27 views
6

在彈性搜索,該過濾器ElasticSearch布爾過濾用一個短語(而不是單個字/標籤)

{ 
    "bool": { 
    "must": { 
     "term": { 
     "article.title": "google" 
     } 
    } 
    } 
} 

正確返回與標題爲「谷歌」的文章。

然而,

{ 
    "bool": { 
    "must": { 
     "term": { 
     "article.title": "google earth" 
     } 
    } 
    } 
} 

不返回任何結果,儘管有在標題中的原話「谷歌地球」的文章。我希望這樣做。

完整的查詢:

{ 
    "size": 200, 
    "filter": { 
    "bool": { 
     "must": { 
     "term": { 
      "article.title": "google maps" 
     } 
     } 
    } 
    }, 
    { 
    "range": { 
     "created_date": { 
     "from": "2013-01-11T02:14:03.352Z" 
     } 
    } 
    }] 
} 
} 

正如你所看到的,我沒有「查詢」 - 只是一個過濾器,大小和範圍。所以我認爲ElasticSearch正在使用默認分析器...?

我誤解了什麼?


編輯:對於那些尋求的解決方案,這是我的過濾器:

{ 
    "query": { 
    "bool": { 
     "must": { 
     "must_match": { 
      "article.title": "google earth" 
     } 
     } 
    } 
    } 
} 

節點:(1)我們用 「查詢」 和包裹布爾過濾器(2)「術語「改爲」must_match「,這導致整個短語匹配(與」匹配「相反,該匹配將使用谷歌地球上的標準分析器來搜索article.title)。

完整的查詢看起來是這樣的:

{ 
    "size": 200, 
    "filter": { 
    "query": { 
     "bool": { 
     "must": { 
      "must_match": { 
      "article.title": "google earth" 
      } 
     } 
     } 
    } 
    } 
} 

FWIW,我有「過濾器」字段中這一條件(而不是使用標準的查詢)的原因是,有時我想用一個「 must_not「而不是」must_not「,有時我還將其他元素添加到查詢中。

+0

您的分析器對於article.title看起來像什麼?如果您使用「關鍵字」以外的任何字詞分析該字段,則該字段將被標記爲[google]和[地球],這將使其不匹配。 – Zach 2013-02-09 23:54:07

+0

嗯,是從查詢結轉到過濾器的文章?我已更新我的問題來說明我的意思。 – 2013-02-10 02:14:48

回答

9

Elasticsearch根本沒有使用分析器,因爲您已經使用了term query,它會查找確切的術語。

對您的title字段進行了分析(除非您另有指定),因此"google earth"將被索引爲["google","earth"]這兩個字詞。這就是爲什麼term查詢"google"有效,但"google earth"term查詢不 - 該EXACT字詞不存在。

如果您使用match query來代替,那麼您的查詢條件將在搜索之前進行分析。

0

對於那些最近在這個絆腳石,被告知,一個更簡潔的方式來表示

{"query":{"bool":{"must":{"must_match":{"article.title":"google earth"}}}}} 

{"query":{"match_phrase":{"article.title":"google earth"}}} 
0

我爆炸的方式傳遞的短語,所以只是改變解決了這個。

{"bool":{"must":{"term":{"article.title":"google earth"}}}} 

{"bool":{"must":{"term":{"article.title":["google", "earth"]}}}} 

它不漂亮,如果你有很多疑問回事可能太慢,但它的作品。

注意,我只是發現這也會返回任何結果與「谷歌」或「地球」。 。

0

使用Elasticsearch 5.4.2,我的解決方案演變爲以下之一:

{"query": { 
    "bool": { 
     "must": { 
      "match_phrase": { 
       "article.title": "google earth"}}}}} 

希望這可以幫助別人。

相關問題