Elastic-QueryString无法正常工作

时间:2017-03-15 11:34:04

标签: c# elasticsearch nest

我很有弹性。我正在尝试使用以下代码进行搜索,但是当我想要回到“#34; house"”时,如果我输入" hou"我能找到它,但是如果我输入" ouse"它不起作用。此外,分析仪也无法正常工作。这是添加它的正确位置吗?

var response = client.Search<Homes>(n => n
    .Index(index)
    .Type(type)
    .Size(searchSize)
    .From(0)
    //.Analyzer(analyzername)
    .TrackScores(true)
   .Query(q=>q.QueryString(qs=>qs.Query("*"+searchWord+"*")
                                 .Fields(f=>f.Field(fieldsForSearchList[0]))
                                 .Analyzer(analyzername)))
);

2 个答案:

答案 0 :(得分:1)

我们不知道分析仪是否工作,因为您没有提供它的名称,也没有显示分析仪的组成。没有这些信息,就无法回答你的问题:)

有几点可以帮助你朝着正确的方向前进

  1. 您在query string query中使用通配符。默认情况下,这些都没有启用,因为它们在性能方面可能很昂贵(通常有更好的方法来索引数据,例如使用自定义分析器)。您可以在.AnalyzeWildcard()的正文中使用.QueryString()来评估通配符,但我希望您已经使用包含edgengram token filter的分析器在索引时分析此字段,因为您获得了结果回到部分期限"hou"
  2. 您还可以应用edgengram令牌过滤器,通过构建应用reverse令牌过滤器的自定义分析器,然后edgengram,从术语末尾(而不是开始)生成ngrams过滤,然后是另一个reverse令牌过滤器。您可能希望将此分析器和索引应用于单独的multi-field子字段(可能称之为"reverse"?)然后在搜索时,搜索字段和子字段,对“转发”应用提升“字段(因为人们倾向于为搜索添加前缀,但在您的域中可能会有所不同)。

答案 1 :(得分:0)

在索引时间,它需要Ngram过滤器,不仅需要EdgeNGram,因为我们不仅要从左边创建子词,还要从单词的不同位置创建子词。例如,单词house将被切割为[ho,ou,美国,SE,侯,组织单位,使用,HOUS,乌斯房子。 尽管它在索引上花费的时间更多,因为它创建了比EdgeNGram更多的单词。 有了EdgeNGram,我们得到了 [HO,侯,HOUS,房子]。