【问题标题】:NEST Match Query IssueNEST 匹配查询问题
【发布时间】:2018-09-13 14:56:21
【问题描述】:

我目前正在为手机数据库开发 NEST 搜索器。我在制作动态版本方面运气不佳,以便用户可以过滤某些术语以在前端搜索。

这是因为 NEST 不喜欢用变量替换字段“f.something”。由于这个原因,我使用了静态,因为我相信我可以通过一些对象实例化来做到这一点。

但是,现在即使我收到了有效的 NEST 响应,它们也总是空的,即使显然有结果。例如“姓名”用于字段,“iPhone”用于查询。我错过了什么?提前致谢。

附:注释掉的代码曾经有“bool”和“should”签入,但同样我一直没有得到任何结果。

private ISearchResponse<MasterProduct> SearchThis(ElasticClient client, string query, string field, int pageSize, int recordNumber)
        {
            var searchLayout = new SearchRequest<MasterProduct>
            {
                Size = pageSize,
                From = recordNumber,
                Query = new MatchQuery
                {
                    Field = field,
                    Query = query,
                    Fuzziness = Fuzziness.Auto,
                    PrefixLength = 2,
                    Lenient = true,
                    FuzzyRewrite = MultiTermQueryRewrite.TopTermsBlendedFreqs(10)
                }
            };
            var searchResponse = client.Search<MasterProduct>(searchLayout);
            return searchResponse;
            }

            /*var searchResponse = client.Search<MasterProduct>(s => s
                .From(recordNumber)
                .Size(pageSize)
                .Query(q => q
                .Match(a => a
                    .Field(f => f.MasterProductName) 
                    .Query(query)
                    .Fuzziness(Fuzziness.Auto)
                    .PrefixLength(2)
                    .Fuzziness(Fuzziness.Auto)
                    .Lenient()
                    .FuzzyRewrite(MultiTermQueryRewrite.TopTermsBlendedFreqs(10))
                    )

                .Match(b => b
                    .Field(f => f.ManufacturerName)
                    .Query(query)
                    .Fuzziness(Fuzziness.Auto)
                    .PrefixLength(2)
                    .Fuzziness(Fuzziness.Auto)
                    .Lenient()
                    .FuzzyRewrite(MultiTermQueryRewrite.TopTermsBlendedFreqs(10))
                    )

                .Match(c => c
                    .Field(f => f.MasterAttributes)
                    .Query(query)
                    .Fuzziness(Fuzziness.Auto)
                    .PrefixLength(2)
                    .Fuzziness(Fuzziness.Auto)
                    .Lenient()
                    .FuzzyRewrite(MultiTermQueryRewrite.TopTermsBlendedFreqs(10))
                    )
                )
            );
            Console.WriteLine(searchResponse.Hits.Count());

            foreach (var hit in searchResponse.Documents)

            {

                Console.WriteLine(hit.MasterProductId);

            }*/
    }

【问题讨论】:

  • “NEST 不喜欢用变量替换字段“f.something”” - 你能详细说明你的意思吗?你在寻找类似.Suffix(...):elastic.co/guide/en/elasticsearch/client/net-api/current/…
  • @RussCam 感谢 Russ 的回复。本质上,我想根据输入的变量搜索 NEST 中的某个字段。因此将输入“MasterProductId”,查询将在该字段上进行搜索。但是我找不到这样做的方法,似乎要搜索的字段都需要硬编码。是这样吗?再次感谢:)
  • Field 类型具有从string 的隐式转换,因此您可以为该字段传递string 输入。请注意,字符串是逐字记录的,而不是表达式或 PropertyInfo 的大小写,因此如果您使用默认值滚动,则字符串值需要采用驼峰式大小写,例如masterProductName.
  • @RussCam 非常感谢你的工作,现在我只需要解决我无法查询数字的问题哈哈

标签: c# .net elasticsearch nest


【解决方案1】:

@RussCam 回答了上述 cmets 中的问题。 重申一下,仅将字符串作为参数传递给字段,而不是其他数据类型。 Camelcase 也是为此工作所必需的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-03-11
    • 2016-06-04
    • 2014-10-21
    • 2019-09-13
    • 1970-01-01
    • 1970-01-01
    • 2021-02-10
    相关资源
    最近更新 更多