弹性搜索多重匹配

Elastic Search multi match

我是 ElasticSearch 的新手。现在我有一个要求需要 return 所有包含关键字的结果。

public Class People(){
    public string UserId {get; set;}
    public string FirstName {get; set;}
    public string LastName {get; set;}
}

如果三个字段之一包含关键字,我想过滤所有人员,类似于 like "%keyword%"

例如,我有一个人

var people = new People() {
    UserId = "lastname.middlename.firstname",
    FirstName = "firstname",
    LastName = "lastname"
}

如何通过搜索关键字ddl得到这个Peoplle,如何设置索引以及如何查询。

我试过像下面这样用 NEST 查询

  var keyword = "ddl"
  var result = await _client.SearchAsync<People>(s => 
      s.Query(q => q.MultiMatch(m => m.Fields(f => f.Field(ff => ff.UserId).Field(ff => ff.FirstName).Field(ff => ff.LastName)).Query(keyword)))
  );

不行。仅当我将关键字更改为 firstnamelastnamelastname.middlename.firstname[= 时才有效13=]

有什么方法可以达到要求吗?

简短的回答是,您可能希望为每个目标字段配置一个分析器,将术语标记为三元组,可能使用 ngram token filtermin_grammax_gram 集到 3。此分析将为 middlename 生成一个 ddl 标记,然后匹配您的查询。

较长的答案是您需要阅读有关 Analysis, and how to write and test analyzers with the .NET client. You may want to go through the example repository that builds a Nuget search application 的内容。这是一个相当复杂的演练,涉及许多概念,包括分析。

要搜索部分字段,您应该在映射中使用 ngram tokenizer

它将使用不同大小的 windows 标记您的字段。

这应该可以解决您的问题,但您需要注意几点:

  • 您可能只想在索引时使用此分析器。在索引和搜索中使用此分词器可能会生成 LOT 不相关的结果。
  • 使用最小 window 尺寸(min_gram 参数)不要太低。在你的情况下 3 会起作用。
  • 索引的大小可以大幅增长。

另一种实施起来更简单但通常效率不高的解决方案是在查询字符串中使用 wildcards queries。它与 SQL.

中的 LIKE 运算符非常相似