弹性搜寻多重比对

时间:2019-06-04 08:05:34

标签: elasticsearch nest

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

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

如果三个文件之一包含关键字,则类似于“%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)))
  );

它不起作用。仅当我将关键字更改为 firstname lastname lastname.middlename.firstname

时,此方法才有效

有什么办法可以满足要求?

2 个答案:

答案 0 :(得分:0)

简短的答案是,您可能想为每个目标字段配置一个分析器,以将术语标记成三元组,可能使用min_grammax_gram设置为3的ngram token filter 。此分析将为ddl生成一个middlename令牌,然后该令牌将与您的查询匹配。

更长的答案是,您需要阅读有关Analysis以及如何与.NET客户端进行writetest analyzers的内容。您可能要通过the example repository that builds a Nuget search application。这是一个相当复杂的演练,涉及许多概念,包括分析。

答案 1 :(得分:0)

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

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

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

  • 您可能只想在索引时间使用此分析器。在索引编制和搜索过程中都使用该标记器可能会产生很多无关的结果。
  • 使用最小窗口大小(min_gram参数)不要太小。在您的情况下,3可以使用。
  • 索引的大小可以大大增加。

另一个易于实现但通常效率不高的解决方案是在查询字符串中使用wildcards queries。它与SQL中的 LIKE 运算符非常相似。