如何在elasticsearch中搜索Nest.Net中的GUID?

Tha*_*aja 3 .net elasticsearch nest

我正在使用Nest,这是一个用于弹性搜索的.Net客户端.我在搜索GUID时遇到问题.由于GUID具有" - ",因此elasticsearch正在考虑作为令牌.

以下是我面临的问题.

我有一个具有以下属性的实体"员工".

   Id : Guid 
   Name : varchar 
   DepartmentId : Guid (E.g cb5d39ee-05f0-4351-baba-8eed6c9111ad)
Run Code Online (Sandbox Code Playgroud)

现在我需要获得属于特定部门的员工列表.所以我将通过部门ID.

由于DepartmentId中有一个" - ",因此elasticsearch正在考虑作为一个分隔符,因为我无法得到结果.

员工班

public class Employee
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    [ElasticProperty(Analyzer = "keyword")]
    public Guid DepartmentId { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

下面是示例代码.

 class Program
{
    static string indexName = "Elasticsearchsamples".ToLowerInvariant();        

    private static void IndexEmployees()
    {
        List<Employee> employees = new List<Employee>();
        Employee employee;

        var deptId = new Guid("cb5d39ee-05f0-4351-baba-8eed6c9111ad");

        employee = new Employee()
        {
            Id = Guid.NewGuid(),
            Name = "Raja",
            DepartmentId = deptId
        };
        employees.Add(employee);

        employee = new Employee()
        {
            Id = Guid.NewGuid(),
            Name = "Ram",
            DepartmentId = deptId
        };
        employees.Add(employee);

        employee = new Employee()
        {
            Id = Guid.NewGuid(),
            Name = "Guru",
            DepartmentId = Guid.NewGuid()
        };
        employees.Add(employee);

        if (SearchClient.IsConnected())
        {
            SearchClient.ElasticClientInstance.DeleteIndex(indexName);              

            var result = SearchClient.ElasticClientInstance.IndexMany(employees, indexName);
        }
    }

    private static void SearchEmployees()
    {

        var searchDescriptor = new SearchDescriptor<Employee>();
        searchDescriptor.Index(indexName);
        var deptId = new Guid("cb5d39ee-05f0-4351-baba-8eed6c9111ad");
        searchDescriptor.Query(qq => qq.Term(x => x.DepartmentId, deptId.ToString().ToLowerInvariant()));
        //searchDescriptor.Query(qq => qq.Term(x => x.Name, "raja"));

        var result = SearchClient.ElasticClientInstance.Search(searchDescriptor);
        Console.WriteLine(result.Total);
    }

    static void Main(string[] args)
    {
        System.Net.ServicePointManager.Expect100Continue = false;            
        IndexEmployees();
        SearchEmployees();
        Console.Read();
    }
}
Run Code Online (Sandbox Code Playgroud)

Pai*_*ook 11

在您的Employee类中,您需要告诉Elasticsearch不要分析DepartmentId字段或使用关键字分析器.请注意,关键字分析器的文档建议如下:

类型关键字的分析器,将整个流"标记"为单个标记.这对于诸如邮政编码,ID等数据非常有用.请注意,使用映射定义时,将字段标记为not_analyzed可能更有意义.

您可以执行以下任一操作,如下所示:

 //do not analyze the value
 [ElasticProperty(Index = FieldIndexOption.not_analyzed)]
 public Guid DepartmentId;

 //use keyword analyzer
 [ElasticProperty(Analyzer = "keyword")]
 public Guid DepartmentId;
Run Code Online (Sandbox Code Playgroud)