2016-05-23 10 views
1

Ich muss nach einem Schlüsselwort für mehrere Felder für dieselbe Abfragezeichenfolge suchen.Match und Match_phrase für mehrere Felder mit derselben Abfragezeichenfolge - Elastische Suche (Nest)

"bool": { 
     "should": [ 
      { 
       "match": { 
          "ABC": "Apple" 
         } 
      }, 
      { 
       "match": { 
          "XYZ": "Apple" 
         } 
      } 
     ] 
    } 

Wenn ich die Abfrage DSL schrieb, hat es sich als Multimatch Abfrage übersetzt worden (nicht sicher, ob der obige Code und DSL gleich sind)

.Bool(b => b 
.Should(sh => sh 
.MultiMatch(c => c 
.Fields(f => f.Field(p => p.ABC).Field("XYZ")) 
.Query(keyz))))) 

Ebenso möchte ich einen DSL-Abfrage schreiben, aber ich möchte match_phrase ausführen. Kann mir jemand dabei helfen?

TIA

Antwort

2

Bei einem Dokumenttyp

public class Document 
{ 
    public string ABC { get; set; } 
    public string XYZ { get; set; } 
} 

Diese

var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200")); 
var defaultIndex = "default-index"; 
var connectionSettings = new ConnectionSettings(pool) 
     .DefaultIndex(defaultIndex) 
     .DefaultFieldNameInferrer(p => p); 

var client = new ElasticClient(connectionSettings); 
var keyz = "Apple"; 

client.Search<Document>(s => s 
    .Query(q => q 
     .Bool(b => b 
      .Should(sh => sh 
       .Match(c => c 
        .Field(p => p.ABC) 
        .Query(keyz) 
       ), 
        sh => sh 
       .Match(c => c 
        .Field(p => p.XYZ) 
        .Query(keyz) 
       ) 
      ) 
     ) 
    ) 
); 

würden Sie diese

von taking advantage of operator overloading verkürzen
client.Search<Document>(s => s 
    .Query(q => q 
     .Match(c => c 
      .Field(p => p.ABC) 
      .Query(keyz) 
     ) 
     || q.Match(c => c 
      .Field(p => p.XYZ) 
      .Query(keyz) 
     ) 
    ) 
); 

Beide produzieren

{ 
    "query": { 
    "bool": { 
     "should": [ 
     { 
      "match": { 
      "ABC": { 
       "query": "Apple" 
      } 
      } 
     }, 
     { 
      "match": { 
      "XYZ": { 
       "query": "Apple" 
      } 
      } 
     } 
     ] 
    } 
    } 
} 
+0

Hallo Russ. Danke für die Hilfe. Darf ich wissen, warum ".DefaultFieldNameInferrer (p => p)" verwendet wird und wie hilft es? Und ich versuche tatsächlich, zuerst eine Übereinstimmungsphrase auszuführen, und wenn die Treffer 0 von der Match_phrase-Abfrage sind, dann plane ich, Match-Abfrage auszuführen. – ASN

+0

Werfen Sie einen Blick auf die Dokumentation für '.DefaultFieldNameInferrer()' - https://www.elastic.co/guide/en/elasticsearch/client/net-api/current/field-inference.html#camel-casing. Sie können steuern, wie Feldnamen aus Ihren POCO-Eigenschaftsnamen abgeleitet werden. Sie könnten eine 'match_phrase' und eine' match' gleichzeitig mit einer 'bool' Abfrage ausführen –

+0

Danke Russ. Aber ich möchte match_phrase für beide Felder zuerst ausführen, und wenn die Ergebnisse 0 sind, dann möchte ich eine Übereinstimmungsabfrage für diese Felder erneut ausführen. Ich plane nicht, eine Übereinstimmungsphrase auf einem Feld und eine Übereinstimmung auf einem anderen Feld zu machen. Und ist meine Multimatch-DSL-Abfrage falsch? – ASN