You are right that you must find documents in which the attached document has a value of 1 AND a value of 2.
You can observe how elasticsearch behaves by doing the following in sense (chrome plugin) :
PUT http://localhost:9200/nested_example { "mappings": { "indexentry" : { "properties": { "nestedCollection": { "type": "nested", "properties": { "prop1" : { "type": "string", "index": "not_analyzed" }, "prop2" : { "type": "string", "index": "not_analyzed" } } } } } } } POST http://localhost:9200/nested_example/indexentry/1 { "nestedCollection": [ { "prop1" : "A", "prop2" : "A" }, { "prop1" : "B", "prop2" : "B" } ] } POST http://localhost:9200/nested_example/indexentry/2 { "nestedCollection": [ { "prop1" : "C", "prop2" : "C" }, { "prop1" : "D", "prop2" : "D" } ] } POST http://localhost:9200/nested_example/indexentry/_search { "query": { "nested": { "path": "nestedCollection", "query": { "bool": { "must": [ { "term": { "nestedCollection.prop1": { "value": "A" } } }, { "term": { "nestedCollection.prop2": { "value": "A" } } } ] } } } } }
The previous query will only find document 1 , but as soon as you change the query term for nestedColleciton.prop2 to find B instead of A , you will no longer receive any answer as expected.
If I update the example to be more true for your comparisons and queries, I cannot reproduce the behavior of your witness:
PUT http://localhost:9200/nested_example { "settings": { "analysis": { "tokenizer": { "my_ngram": { "type": "nGram", "min_gram": "1", "max_gram": "15" } }, "analyzer": { "my_index_analyzer_1": { "type": "custom", "tokenizer": "my_ngram", "filters": [ "lowercase" ] }, "my_search_analyzer_1": { "type": "custom", "tokenizer": "whitespace", "filters": [ "lowercase" ] } } } }, "mappings": { "indexentry": { "properties": { "nestedCollection": { "type": "nested", "properties": { "prop1": { "type": "string", "index_analyzer": "my_index_analyzer_1", "search_analyzer": "my_search_analyzer_1" }, "prop2": { "type": "string", "analyzer": "keyword" } } } } } } } POST http://localhost:9200/nested_example/indexentry/1 { "nestedCollection": [ { "prop1" : "value1", "prop2" : "value1" }, { "prop1" : "value2", "prop2" : "value2" } ] } POST http://localhost:9200/nested_example/indexentry/2 { "nestedCollection": [ { "prop1" : "value3", "prop2" : "value3" }, { "prop1" : "value4", "prop2" : "value4" } ] } POST http://localhost:9200/nested_example/indexentry/_search { "query": { "nested": { "path": "nestedCollection", "query": { "bool": { "must": [ { "term": { "prop1": { "value": "value1" } } }, { "query_string": { "fields": [ "prop2" ], "query": "value1" } } ] } } } } }
Can you update the previous example to better reproduce your situation?
Final note in NEST you can rewrite the request as:
client.Search<IndexEntry1>(d => d .Query(query => query .Nested(n => n .Path(p => p.NestedProperty1) .Query(q => q.Term(p => p.NestedProperty1.First().Member1, "value1") && q.QueryString(s => s .OnField(p => p.NestedPropery1.First().Member2) .Query("value2") ) ) ) );
Strongly printed and with less nesting.