Elasticsearch 6 NEST如何仅检索与搜索关键词完全匹配的文档?
Exact Match Document Retrieval with Elasticsearch & NEST
Nice work getting the foundation right here—your use of the [Keyword] attribute on FullName is exactly what you need for exact match searches in Elasticsearch. Let's break down why this works, plus a few small tweaks to make your code more robust.
What You're Doing Correctly
- The
[Keyword]attribute tells Elasticsearch to index theFullNamefield as a single, unbroken string instead of splitting it into individual tokens. That means when you use aTermquery, it's looking for the exact full value, not parts of the name. - Your
Termquery is the perfect choice here—it's designed for matching exact values in keyword fields.
Small Improvements for Reliability
- Guard Against Invalid Input: Add a check for null/empty
FullNameto avoid wasting a call to Elasticsearch. - Validate the Response: Always check if the Elasticsearch response is valid before accessing documents—this helps catch issues like index errors or malformed queries.
- Cleaner Error Handling: Instead of just re-throwing the exception, consider logging it first to help debug issues later.
Updated Code
Person SearchPerson(Person person) { // Guard clause for invalid input if (person == null || string.IsNullOrWhiteSpace(person.FullName)) { return null; // Or throw an ArgumentException if you want to enforce valid input } try { var response = client.Search<Person>(s => s .Query(q => q.Term(ff => ff.FullName, person.FullName))); // Check if the response is valid before proceeding if (!response.IsValid) { // Log response.ServerError.Details here if you have logging configured return null; } return response.Documents.FirstOrDefault(); } catch (Exception ex) { // Log exception details (message, stack trace) here throw; // Re-throw to preserve the original stack trace } } public class Person { public Guid Id { get; set; } [Keyword] public string FullName { get; set; } public decimal Salary { get; set; } // Example of another property }
Bonus: Case-Insensitive Exact Matches
If you need exact matches that ignore case, you can add a lowercase normalizer to the [Keyword] attribute. First, define the normalizer in your index settings (you can do this when creating the index), then update the property:
[Keyword(Normalizer = "lowercase")] public string FullName { get; set; }
Just make sure to convert the input person.FullName to lowercase before querying to match the normalized values in Elasticsearch.
内容的提问来源于stack exchange,提问作者Guid
相关产品推荐
相关产品推荐

