Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Added C# example to create complex index #24589

Closed
wants to merge 1 commit into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 76 additions & 0 deletions sdk/search/Azure.Search.Documents/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -359,6 +359,82 @@ SearchIndex index = new SearchIndex("hotels")
client.CreateIndex(index);
```

Or using c# classes with decorators:
```C# Snippet:Azure_Search_Tests_Samples_Readme_CreateManualIndex_CSharp_API
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These snippets are actually declared in-source, for example, search for "Snippet:Azure_Search_Tests_Samples_Readme_CreateManualIndex" like the snippet directly above. We do this to ensure that samples compile and most often run them during testing to make sure they work (and continue to work) correctly.

We also try to keep the most common scenarios in the README to avoid it getting too large. It might be better to instead add a sample under Azure.Search.Documents/test/samples, along with corresponding markdown files in Azure.Search.Documents/samples.

I can help you with that, if you like.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Alternatively, instead of a new sample, we could also update one of the existing Hotel samples to add a complex field. This would have the additional benefit that it's already incorporated into existing samples instead of being an entirely separate one.

Copy link
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

For me it's ok either approach, but i really think to have a list of objects it's not that uncommon.
This is just the first time i used Azure Search and almost immediately i needed a list of objects, that's why I think there is a lack of documentation and tried to add it here.

If you prefer me to modify one of the samples it's ok, could you please point me to the most appropriate one 😄?

Thank you!!

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@heaths Over 10% of indexes used in the past 7 days have complex fields, so it's not uncommon.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We could include it in an existing sample, then, but 1) sample snippets in markdowns should not be code-complete samples, and 2) need to use the same syntax to make sure they are testable. I think modifying the Hotels sample would be ideal, and make sure the existing snippets show an example of complex types. I don't think it warrants a completely separate sample.

@Mohit-Chakraborty @tg-msft ?

using Azure.Search.Documents.Indexes;
using Azure.Search.Documents.Indexes.Models;
using System.Text.Json.Serialization;
using Microsoft.Spatial;
using Azure.Core.Serialization;
using System.Collections.Generic;

namespace sample
{
public class Hotel
{
[JsonIgnore]
macel94 marked this conversation as resolved.
Show resolved Hide resolved
public const string HOTELID_JSON_NAME = "HotelId";

[SimpleField(IsKey = true, IsFilterable = true)]
[JsonPropertyName(HOTELID_JSON_NAME)]
public string HotelId { get; set; }

[JsonIgnore]
public const string NAME_JSON_NAME = "HotelName";

[JsonPropertyName(NAME_JSON_NAME)]
[SearchableField(IsFilterable = true, IsSortable = true)]
public string Name { get; set; }

[JsonIgnore]
public const string GEOLOCATION_JSON_NAME = "GeoLocation";

[SimpleField(IsFilterable = true, IsSortable = true)]
[JsonConverter(typeof(MicrosoftSpatialGeoJsonConverter))]
[JsonPropertyName(GEOLOCATION_JSON_NAME)]
public GeographyPoint GeoLocation { get; set; }

[JsonIgnore]
public const string LOCATION_JSON_NAME = "Location";

[SearchableField(IsFilterable = true, IsFacetable = true)]
[JsonPropertyName(Hotel.LOCATION_JSON_NAME)]
public string Location { get; set; }

[JsonIgnore]
public const string ROOMS_JSON_NAME = "Rooms";

[JsonPropertyName(Hotel.ROOMS_JSON_NAME)]
public List<Room> Rooms { get; set; }
}

public class Room
{
[JsonIgnore]
public const string ROOMID_JSON_NAME = "RoomId";

[SimpleField(IsFilterable = true, IsFacetable = true)]
[JsonPropertyName(Room.ROOMID_JSON_NAME)]
public string RoomId { get; set; }

[JsonIgnore]
public const string CAPACITY_JSON_NAME = "Capacity";

[SimpleField(IsFilterable = true, IsSortable = true)]
[JsonPropertyName(Room.CAPACITY_JSON_NAME)]
public int Capacity { get; set; }
}
}
```

And then `FieldBuilder`:
```C# Snippet:Azure_Search_Tests_Samples_Readme_CreateManualIndex_CSharp_API_CreateIndex
var fieldBuilder = new FieldBuilder();
var searchFields = fieldBuilder.Build(typeof(Hotel));
var definition = new SearchIndex("hotels", searchFields);
client.CreateIndex(definition);
```

### Adding documents to your index

You can `Upload`, `Merge`, `MergeOrUpload`, and `Delete` multiple documents from
Expand Down