2015-04-30 24 views
5

Sto cercando la query del nido ElasticSearch che fornirà la corrispondenza esatta sulla stringa che contiene spazi utilizzando C#.Ricerca elastica: stringa di ricerca che contiene spazi e caratteri speciali utilizzando C#

ad esempio - Voglio cercare una parola come "XYZ Company Solutions". Ho provato la query querystring ma mi dà tutti i record indipendentemente dal risultato della ricerca. Inoltre ho letto sul post e ho scoperto che dobbiamo aggiungere alcuni mapping per il campo. Ho provato l'analizzatore "Not_Analyzed" sul campo, ma ancora non ha funzionato.

Ecco il mio codice di 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" 

Se qualcuno ha esempio completo o passi in C# allora si può si prega di condividere con me?

+1

può anche fornire lo schema di indice che sta ottenendo creato elasticsearch? curl -XGET localhost: 9200/name_of_the_index? pretty = true Fondamentalmente, per abbinare la stringa esatta, è necessario assicurarsi di non analizzarlo durante l'indicizzazione. –

risposta

2

Si prega di fare riferimento al codice sottostante, penso che questo si incontrerà yo i tuoi requisiti Qui ho creato e mappato l'indice con template dinamico e poi ho fatto l'XDCR. Ora tutti i campi stringa non saranno analizzati.

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))))))); 
       } 

Grazie

Mukesh Raghuwanshi

+0

Grazie Mukesh, questo è esattamente ciò di cui ho bisogno .. :-) – Diboliya

0

Sembra che sia sufficiente aggiornare il nuovo indice dopo l'operazione di reindicizzazione.

Utilizzando l'esempio di codice (e la query di primo termine), stavo vedendo lo stesso risultato: 0 risultati.

Aggiunta la Refresh chiamata seguente dopo che i risultati reindex.Subscribe() chiamata in un singolo colpo da restituire:

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

Grazie per la risposta Rick, ho provato con questo, ma ottenendo lo stesso risultato, ovvero 0 risultati. – Diboliya

1

Hai provato la query match_phrase?

La query DSL la richiesta è la seguente:

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

In C# provare quanto segue:

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

controllare la documentazione ufficiale per maggiori informazioni:

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

Problemi correlati