Socket: how you should deal with the main points in C #

I am trying to find "everything" in the index for a search query and display a context with highlighted terms. I get an appropriate set of documents, but I can’t understand how I should handle the selection in the code.

At this point, I'm just trying to dump it into a literal, and the code is sorta sorta below, but it doesn't seem to have glare for each document and just doesn't seem right. I found many examples of how to make a query with highlighting, but I did not find any example of how to do anything with displaying results. Any suggestions? Thanks!

var searchResults = client.Search<Document>(s => s.Query(qs => qs.QueryString(q => q.Query(stringsearch))).Highlight(h => h .PreTags("<b>") .PostTags("</b>") .OnFields( f => f .OnField("*") .PreTags("<em>") .PostTags("</em>") ) )); Literal1.Text = ""; foreach(var h in searchResults.Hits) { foreach(var hh in h.Highlights) { foreach(var hhh in hh.Value.Highlights) { Literal1.Text += hhh+@ "<br>"; } } } 
+5
source share
1 answer

Change The solution below is tested only on ElasticSearch 2.x, and not on ElasticSearch 5.x / 6.x

Highlights can be accessed in searchResults.Highlights (for all highlights) or in IHit<T>.Highlights for this hit.

Is this what you are trying to achieve?

 using System; using System.Collections.Generic; using System.Linq; using System.Threading; using Elasticsearch.Net.ConnectionPool; using Nest; namespace ESTester { internal class Program { private static void Main(string[] args) { const string indexName = "testindex"; var connectionSettings = new ConnectionSettings(new SingleNodeConnectionPool(new Uri("http://127.0.0.1:9200"))); var client = new ElasticClient(connectionSettings); var existResponse = client.IndexExists(descriptor => descriptor.Index(indexName)); if (existResponse.Exists) client.DeleteIndex(descriptor => descriptor.Index(indexName)); // Making sure the refresh interval is low, since it boring to have to wait for things to catch up client.PutTemplate("", descriptor => descriptor.Name("testindex").Template("testindex").Settings(objects => objects.Add("index.refresh_interval", "1s"))); client.CreateIndex(descriptor => descriptor.Index(indexName)); var docs = new List<Document> { new Document{Text = "This is the first document" }, new Document{Text = "This is the second document" }, new Document{Text = "This is the third document" } }; var bulkDecsriptor = new BulkDescriptor().IndexMany(docs, (descriptor, document) => descriptor.Index(indexName)); client.Bulk(bulkDecsriptor); // Making sure ES has indexed the documents Thread.Sleep(TimeSpan.FromSeconds(2)); var searchDescriptor = new SearchDescriptor<Document>() .Index(indexName) .Query(q => q .Match(m => m .OnField(d => d.Text) .Query("the second"))) .Highlight(h => h .OnFields(f => f .OnField(d => d.Text) .PreTags("<em>") .PostTags("</em>"))); var result = client.Search<Document>(searchDescriptor); if (result.Hits.Any()) { foreach (var hit in result.Hits) { Console.WriteLine("Found match: {0}", hit.Source.Text); if (!hit.Highlights.Any()) continue; foreach (var highlight in hit.Highlights.SelectMany(highlight => highlight.Value.Highlights)) { Console.WriteLine("Found highlight: {0}", highlight); } } } Console.WriteLine("Press any key to exit!"); Console.ReadLine(); } } internal class Document { public string Text { get; set; } } } 

Edit Comments: In this example, there is no real reason for if(!hit.Highlights.Any()) continue; , except that it is safe, but if you made the following request, you could get hits without glare:

  var docs = new List<Document> { new Document{Text = "This is the first document", Number = 1 }, new Document{Text = "This is the second document", Number =500 }, new Document{Text = "This is the third document", Number = 1000 } }; var searchDescriptor = new SearchDescriptor<Document>() .Index(indexName) .Query(q => q .Bool(b => b .Should(s1 => s1 .Match(m => m .Query("second") .OnField(f => f.Text)), s2 => s2 .Range(r =>r .OnField(f => f.Number) .Greater(750))) .MinimumShouldMatch(1))) .Highlight(h => h .OnFields(f => f .OnField(d => d.Text) .PreTags("<em>") .PostTags("</em>"))); internal class Document { public string Text { get; set; } public int Number { get; set; } } 

In this case, you can get hit on the request range, but he would not have any glare.

For number 2, for me, I just looked at the object that I got from the search, both in Quick Watch, and in the object browser and through IntelliSense in VS.

+8
source

Source: https://habr.com/ru/post/1215372/


All Articles