2015-04-30 1 views
5

Я ищу запрос на поиск ElasticSearch, который обеспечит точное соответствие строки, содержащей пробелы в ней, используя C#.Эластичная поисковая строка, содержащая пробелы и специальные символы в ней с использованием C#

например - Я хочу найти слово, например, «XYZ Company Solutions». Я попробовал запрос с запросом, но он дает мне все записи независимо от результата поиска. Также я прочитал в сообщении и обнаружил, что нам нужно добавить некоторые сопоставления для поля. Я попробовал анализатор «Not_Analyzed» на поле, но все-таки это не сработало.

Вот мой код 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" 

Если кто-то есть полный пример или шаги в C#, то пожалуйста, вы можете поделиться со мной?

+1

Вы можете также предоставить указательный схему, которая создается на получение elasticsearch? curl -XGET localhost: 9200/name_of_the_index? pretty = true В принципе, чтобы соответствовать точной строке, вам нужно убедиться, что вы не анализируете ее при индексировании. –

ответ

2

Пожалуйста, обратитесь к приведенному ниже коду, я думаю, что это встретит вас ур. Здесь я создал и сопоставил индекс с динамическим шаблоном, а затем сделал XDCR. Теперь все строковые поля будут not_analysed.

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

Благодаря

Мукеш Raghuwanshi

+0

Спасибо Mukesh, это именно то, что мне нужно .. :-) – Diboliya

0

Похоже, вам просто нужно обновить новый индекс после операции переиндексации.

Используя пример кода (и ваш первый запрос терминов), я увидел тот же результат - 0 ударов.

Добавление следующей Refresh вызова после reindex.Subscribe() результаты вызова в один удар возвращается:

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

Спасибо за ответ Рик, пробовал это, но все равно получаю тот же результат, то есть 0 ударов. – Diboliya

1

Вы пробовали запрос match_phrase?

Запрос DSL запрос состоит в следующем:

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

В C# попробуйте следующее:

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

Проверьте официальную документацию для получения дополнительной информации:

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

Смежные вопросы