2013-10-30 20 views
0

我有一個elasticsearch文件與源象下面這樣:Elasticsearch - 這查詢的型式應採用

{ 
    "_source": { 
     "id": { 
      "value": 1 
     }, 
     "make": "Ford", 
     "model": "Mustang", 
     "color": "Red" 
    } 
} 

我想編寫一個查詢,將匹配短語,如下面:

  • 福特
  • 福特野馬
  • 野馬
  • 野馬福特
  • 福特野馬

但不會匹配像這樣一句話:

  • 福特野馬奧迪
  • 奧迪野馬

應該在這種情況下,應使用什麼類型的查詢?

回答

0

我想,首先你只需要查詢就可以了型號字段。接下來,您需要爲您傳遞的查詢字符串設置合適的分析器。在這種情況下,whitespace analyzer更有意義。因此,這裏是你可以使用查詢:

query_string: { 
    query: { 
    fields: ['make', 'model'] 
    analyzer: 'whitespace' 
    query: 'Ford Mustang' 
    } 
} 
+0

添加以下內容後,它可以正常工作:**「default_operator」:「和」**查詢(我不想讓'ford audi mustang'匹配)並使查詢短語小寫('ford mustang'而不是'Ford Mustang' )。謝謝! –

0

您可以使用布爾葡萄汁:

搜索任何領域:

curl -XPOST 'http://localhost:9200/cars_index/car_type/_search' -d '{"query":{"bool":{"must":[{"query_string":{"query":"Ford"}}, {"query_string":{"query":"mustang"}}]}}}' 

搜索特定字段:

curl -XPOST 'http://localhost:9200/cars_index/car_type/_search' -d '{"query":{"bool":{"must":[{"query_string":{"query":"make:Ford"}}, {"query_string":{"query":"model:mustang"}}]}}}' 

可以使用葡萄汁的組合,不宜,must_not等,以及正如田野上的否定:

{"query":"-make:Ford"} (not make == Ford) 

http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/query-dsl-bool-query.html

+0

只有當我知道「福特」是一個品牌和「野馬」這是真的是一個模型,但我的搜索輸入是包含使一個短語和/或模型,如'福特野馬','野馬福特'或'福特奧迪'。後者不應該匹配。 –

0

我設法使之與工作:

BoolQueryBuilder q = boolQuery(); 
for (String word : phrase.split("\\s+")) { 
    q.must(boolQuery() 
     .should(matchQuery("make", word)) 
     .should(matchQuery("model", word)) 
     .minimumNumberShouldMatch(1) 
    ); 
} 

但我劈搜索短語,並使用它的話建立一個查詢。

有沒有更好的方法來做到這一點?