ElasticSearch Nest。只能在关键字和文本字段上使用前缀查询--不能在类型为float的字段上使用。

问题描述 投票:2回答:1

当搜索文本中包含空格时,在多个字段中搜索值是不工作的。例如,如果我搜索值 "价格",我得到的结果,但如果我搜索 "价格水平",我得到以下错误。

只能在关键字和文本字段上使用前缀查询--不能在类型为float的字段上使用前缀查询。

我在索引的文档中有一个日期字段和一个浮动字段。由于这些字段的存在,错误被抛出。

以下是我创建索引的代码。

var createIndexResponse = client.CreateIndex("messages", c => c.Settings(s => s.NumberOfShards(1).NumberOfReplicas(0).Analysis(a => a.Analyzers(anl => anl.Custom("default", ca => ca.Tokenizer("whitespace").Filters(new List<string>() { "lowercase" }))))).Mappings(ms => ms.Map<Object>(m => m.Properties(p => p.Number(s => s.Name("id").Index(false)).Text(s => s.Name("displaytext").Index(false)).Text(s => s.Name("text").Index(false)).Text(s => s.Name("url").Index(false)).Date(d => d.Name("Search_ReceivedOn"))))));

以下是我的搜索查询。

Dim funcMust = New List(Of Func(Of Nest.QueryContainerDescriptor(Of Object), Nest.QueryContainer))()
funcMust.Add(Function(sh) sh.Term("From", UserID) Or sh.Term("To", UserID))

Dim resp = client.Search(Of Object)(Function(s) s.Index("messages").IgnoreUnavailable(True) _
                            .Query(Function(qry) qry.QueryString(Function(qs) qs.Fields("Search_*").Query(searchText).DefaultOperator(Nest.Operator.And))) _
                            .PostFilter(Function(pf) pf.Bool(Function(b) b.Must(funcMust))).From((pageIndex - 1) * pageSize).Take(pageSize).Source(Function(x) x.Includes(Function(f) f.Fields(fields))))

我在索引文档中有动态列,所以我不能用精确的字段名进行术语查询。有什么办法可以在所有以 "Search_"开头的字段中进行搜索,而不出现我上面提到的错误?

elasticsearch nest
1个回答
0
投票

在我的例子中,当我执行带有空格的搜索时,就会出现这种情况。

我用以下方法解决了这个问题。

Elasticsearch - v6.8.6

Map<String, Float> fields = new HashMap<>();
        fields.put("content.keyword", 1f);
        fields.put("name.keyword", 2f);
        fields.put("tag.keyword", 3f);

SimpleQueryStringBuilder queryBuilder = new SimpleQueryStringBuilder(searchQuery);
queryBuilder.fields(fields);
queryBuilder.analyzeWildcard(Boolean.TRUE);
© www.soinside.com 2019 - 2024. All rights reserved.