2015-04-30 12 views
5

Szukam zapytania zagnieżdżenia ElasticSearch, które zapewni dopasowanie ścisłe na łańcuchu z spacji w nim przy użyciu C#.Elastic Search-Search ciąg znaków zawierający spacje i znaki specjalne w nim przy użyciu C#

na przykład - Chcę wyszukać słowo takie jak "Rozwiązania firmy XYZ". Próbowałem zapytania kwerendy, ale daje mi wszystkie rekordy niezależnie od wyniku wyszukiwania. Czytałem również na postie i stwierdziłem, że musimy dodać kilka mapowań dla tego pola. Próbowałem analizatora "Not_Analyzed" na polu, ale nadal nie działa.

Oto mój kod 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" 

Jeśli ktoś ma pełną przykład lub czynności w C# to można proszę podzielić się ze mną?

+1

można również podać schematu indeksu, który jest coraz utworzony na elasticsearch? curl -XGET localhost: 9200/name_of_the_index? pretty = true Zasadniczo, aby dopasować dokładny ciąg znaków, musisz upewnić się, że nie analizujesz go podczas indeksowania. –

Odpowiedz

2

Proszę zapoznać się z poniższym kodem, myślę, że to spotka yo ur wymagania. Tutaj utworzyłem i zmapowałem indeks z dynamicznym szablonem, a następnie zrobiłem XDCR. Teraz wszystkie pola ciągów będą niepanalizowane.

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

Dzięki

Mukesh Raghuwanshi

+0

Dzięki Mukesh, to jest dokładnie to, czego potrzebuję .. :-) – Diboliya

0

Wygląda na to, że wystarczy odświeżyć nowy indeks po ponownej indeksacji.

Korzystając z przykładu kodu (i zapytania pierwszego terminu), widziałem ten sam wynik - 0 trafień.

Dodanie następującego Refresh połączenia po reindex.Subscribe() wyniki rozmów w jednym trafieniu zwracane:

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

Dzięki za odpowiedź Rick, Próbowałem z tym ale wciąż otrzymuję ten sam wynik, tj. 0 trafień. – Diboliya

1

Czy próbowałeś zapytanie match_phrase?

DSL zapytania wniosek jest następujący:

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

w C# spróbuj wykonać następujące czynności:

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

Sprawdź oficjalnej dokumentacji, aby uzyskać więcej informacji:

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

Powiązane problemy