2012-11-30 72 views
3

我正在試驗ElasticSearch。我在查詢嵌套對象時遇到問題。嵌套的查詢不按預期工作

我的映射:

curl -X GET http://localhost:9200/testt/resource/_mapping?pretty

{ 
    "resource": { 
     "properties": { 
      "bib": { 
       "type": "nested", 
       "properties": { 
        "IssueDate": { 
         "type": "date", 
         "format": "dateOptionalTime" 
        }, 
        "Title": { 
         "type": "string" 
        } 
       } 
      }, 
      "name": { 
       "type": "string" 
      } 
     } 
    } 
} 

我有一個索引資源:

curl -X GET http://localhost:9200/testt/resource/_search?pretty

{ 
    "took": 1, 
    "timed_out": false, 
    "_shards": { 
     "total": 5, 
     "successful": 5, 
     "failed": 0 
    }, 
    "hits": { 
     "total": 1, 
     "max_score": 1.0, 
     "hits": [ 
      { 
       "_index": "testt", 
       "_type": "resource", 
       "_id": "1234", 
       "_score": 1.0, 
       "_source": { 
        "name": "SSS", 
        "bib": { 
         "Title": "XSD", 
         "IssueDate": "2012-12-19" 
        } 
       } 
      } 
     ] 
    } 
} 

curl -X GET http://localhost:9200/testt/resource/1234?pretty

{ 
    "_index": "testt", 
    "_type": "resource", 
    "_id": "1234", 
    "_version": 1, 
    "exists": true, 
    "_source": { 
     "name": "SSS", 
     "bib": { 
      "Title": "XSD", 
      "IssueDate": "2012-12-19" 
     } 
    } 
} 

然而,我可以使用查詢請求無法找到它:

{ 
    "query": { 
     "nested": { 
      "path": "bib", 
      "query": { 
       "query_string": { 
        "query": "XSD" 
       } 
      } 
     } 
    } 
} 

搜索:curl -X GET http://localhost:9200/testt/resource/_search?pretty -d '{ "query" : { "nested" : {"path" : "bib", "query" : { "query_string" : {"query" : "XSD"} } } } }'

{ 
    "took" : 1, 
    "timed_out" : false, 
    "_shards" : { 
     "total" : 5, 
     "successful" : 5, 
     "failed" : 0 
    }, 
    "hits" : { 
     "total" : 0, 
     "max_score" : null, 
     "hits" : [ ] 
    } 
} 

我的問題是:我該如何使用嵌套查詢找到我的對象?我對嵌套對象bib的對象感興趣,它包含字XSD。對象1234明確包含XSD,但我無法找到它。你能告訴我我的查詢是否可以嗎?它出什麼問題了?

回答

3

query_string不支持它,但如果你能自己分析查詢,你可以使用multi_match查詢,做這樣的事情:

{ 
    "query": { 
     "nested": { 
      "path": "bib", 
      "query": { 
       "multi_match": { 
        "query": "XSD", 
        "fields": ["bib.*"] 
       } 
      } 
     } 
    } 
} 

一個可能的問題與此解決方案是,如果你有嵌套的文檔中的任何數字字段,你需要從字段列表中排除。它可以通過向字段名稱添加前綴來實現。例如,您可以重命名所有字符串字段以s_開頭,在這種情況下,您可以使用"fields": ["bib.s_*"]選擇所有字符串字段。

另一種可能的解決方案是使用父母的_all字段。您可以排除_all中的所有父級字段,並專門爲嵌套字段使用_all。所有嵌套字段默認都包含在父項的_all字段中。

+0

我喜歡你的答案。我如何實現'_all'的排除?你可以提供示例查詢與排除? –

+0

它不在查詢中。它在映射中。你需要指定''include_in_all「:false'。有關更多信息,請參閱http://www.elasticsearch.org/guide/reference/mapping/all-field.html。 – imotov

+0

我可能會使用「s_」前綴。謝謝你的幫助。 –

2

你需要在你的query_string query指定默認領域:

curl -XGET localhost:9200/testt/resource/_search -d '{ 
    "query": { 
     "nested" : { 
      "path" : "bib", 
      "score_mode" : "avg", 
      "query" : { 
       "query_string" : { 
        "fields" : ["Title"], 
        "query" : "XSD" 
       } 
      } 
     } 
    } 
}'; 
+0

這不是我的問題的答案。我想掃描所有字段。關於文檔中的'default_field':'默認爲index.query.default_field索引設置,默認設置爲_all.'它是ElasticSearch中的缺陷嗎?我認爲是這樣,因爲我的查詢不像文檔所說的那樣工作。 –

+0

您必須明確設置所有字段,然後:''query_string「:{」{「title」,「Subtitle」] { 「query」:「XSD」 }'[Nested documents](http: /www.elasticsearch.org/guide/reference/mapping/nested-type.html)沒有自己的'_all'字段,它們使用父文檔。 – Thorsten

+0

這是正確的,所以如果你將搜索父對象的_all,你將能夠找到你的文檔'curl -XGET localhost:9200/testt/resource/_search -d'{「query」:{「query_string」:{ 「query」:「XSD」}}}'' – imotov