2015-04-30 10 views
5

Ich suche ElasticSearch Nest Abfrage, die genaue Übereinstimmung für Zeichenfolge mit Leerzeichen in es mit C# bieten wird.Elastic Search-Suche Zeichenfolge mit Leerzeichen und Sonderzeichen in es mit C#

zum Beispiel - Ich möchte nach einem Wort wie 'XYZ Company Solutions' suchen. Ich habe Querystring Abfrage versucht, aber es gibt mir alle Datensätze unabhängig vom Suchergebnis. Auch ich las auf dem Post und fand, dass wir einige Abbildungen für das Feld hinzufügen müssen. Ich habe 'Not_Analyzed' Analysator auf dem Feld versucht, aber es hat immer noch nicht funktioniert.

Hier ist mein Code von C#

var indexDefinition = new RootObjectMapping 
{ 
    Properties = new Dictionary<PropertyNameMarker, IElasticType>(), 
    Name = elastic_newindexname 
}; 
var notAnalyzedField = new StringMapping 
{ 
    Index = FieldIndexOption.NotAnalyzed 
}; 
indexDefinition.Properties.Add("Name", notAnalyzedField); 
objElasticClient.DeleteIndex(d => d.Index(elastic_newindexname)); 
var reindex = objElasticClient.Reindex<dynamic>(r => r.FromIndex(elastic_oldindexname).ToIndex(elastic_newindexname).Query(q => q.MatchAll()).Scroll("10s").CreateIndex(i => i.AddMapping<dynamic>(m => m.InitializeUsing(indexDefinition)))); 
ReindexObserver<dynamic> o = new ReindexObserver<dynamic>(onError: e => { }); 
reindex.Subscribe(o);** 

**ISearchResponse<dynamic> ivals = objElasticClient.Search<dynamic>(s => s.Index(elastic_newindexname).AllTypes().Query(q => q.Term("Name","XYZ Company Solutions")));** //this gives 0 records 

**ISearchResponse<dynamic> ivals1 = objElasticClient.Search<dynamic>(s => s.Index(elastic_newindexname).AllTypes().Query(q => q.Term(u => u.OnField("Name").Value("XYZ Company Solutions"))));** //this gives 0 records 

**ISearchResponse<dynamic> ivals = objElasticClient.Search<dynamic>(s => s.Index(elastic_newindexname).AllTypes().Query(@"Name = 'XYZ Company Solutions'"));** //this gives all records having fields value starting with "XYZ" 

Wenn jemand komplettes Beispiel oder Schritte in C#, dann können Sie bitte mit mir teilen?

+1

Können Sie auch Ihr Indexschema bereitzustellen, die auf Elasticsearch erstellt zu werden? curl -XGET localhost: 9200/name_des_index? pretty = true Um die genaue Zeichenfolge zu finden, müssen Sie sicherstellen, dass Sie sie nicht während der Indizierung analysieren. –

Antwort

2

Bitte beziehen Sie sich auf den untenstehenden Code, ich denke, das wird Sie treffen Ihre Anforderungen. Hier habe ich Index mit dynamischer Vorlage erstellt und zugeordnet und dann die XDCR getan. Jetzt werden alle Zeichenfolgenfelder nicht_analysiert.

IIndicesOperationResponse result = null; 
        if (!objElasticClient.IndexExists(elastic_indexname).Exists) 
        { 
         result = objElasticClient.CreateIndex(elastic_indexname, c => c.AddMapping<dynamic>(m => m.Type("_default_").DynamicTemplates(t => t 
                .Add(f => f.Name("string_fields").Match("*").MatchMappingType("string").Mapping(ma => ma 
                 .String(s => s.Index(FieldIndexOption.NotAnalyzed))))))); 
       } 

Dank

Mukesh Raghuwanshi

+0

Danke Mukesh, genau das brauche ich .. :-) – Diboliya

0

Es sieht so aus, als ob Sie den neuen Index nach der Neuindizierung nur aktualisieren müssen.

Mit Ihrem Codebeispiel (und Ihrer ersten Termabfrage) sah ich das gleiche Ergebnis - 0 Treffer.

Hinzufügen den folgenden Refresh Anruf nach den reindex.Subscribe() Anruf Ergebnisse in einem einzigen Treffer zurückgegeben werden:

objElasticClient.Refresh(new RefreshRequest() { }); 
+0

Danke für die Antwort Rick, mit diesem versucht, aber immer noch das gleiche Ergebnis, d. H 0 Hits. – Diboliya

1

Haben Sie versucht, die match_phrase Abfrage?

Die Abfrage DSL die Anforderung ist folgende:

"query": { 
    "match_phrase": { 
     "title": "XYZ Company Solutions" 
    } 
} 

In C# versuchen Sie Folgendes:

_client.Search<T>(s => s 
    .Index(IndexName) 
    .Types(typeof (T)) 
    .Query(q => q.MatchPhrase(m => m 
     .OnField(f => f.Name) 
     .Query("XYZ Company Solutions")))); 

die offizielle Dokumentation für weitere Informationen überprüfen:

http://www.elastic.co/guide/en/elasticsearch/guide/master/phrase-matching.html#phrase-matching

Verwandte Themen