gpt4 book ai didi

ElasticSearch (NEST) 按数字搜索

转载 作者:行者123 更新时间:2023-12-02 22:15:54 25 4
gpt4 key购买 nike

如果这是一个基本问题,我提前道歉 - 我是 ElasticSearch 的新手,需要接受的内容很多。

现在,我正在尝试实现一个基本的关键字搜索来搜索所有索引列,但我得到了一些关于特定字段 Year 的奇怪结果。我有一定数量的文档,我知道应该从结果中返回,如果我搜索“2014”,所有文档都会成功返回。如果我只搜索“14”,什么也没有返回,如果我添加一个通配符(例如 *14),那么我会返回一个结果,因为它没有使用搜索中的 Year,而是从 Description 字段中提取它。

我 100% 肯定这是我在查询结构上做错了什么,所以有什么提示吗?顺便说一句,如果有人可以提供建议的位置以通过 NEST 了解更多关于 Elastic 的信息,那将非常有帮助。他们的文档有点欠缺,你必须已经了解如何使用 Elastic 才能使大部分内容有意义,因为我不了解,所以我只能跌跌撞撞。

下面是ElasticListing的结构:

    public long Id { get; set; }

public string Brand { get; set; }

public string Manufacturer { get; set; }

public string ActiveTags { get; set; }

public string Description { get; set; }

public int Year { get; set; }

public string Location { get; set; }

我在 NEST 中使用的搜索结构是这样的,其中 keyword 将是“2014”(无引号):

var response = this.ElasticClient.Search<ElasticListing>(s => s
.AllTypes()
.Query(query => query
.Bool(b => b
.Must(must => must
.QueryString(qs => qs.Query(keyword))
)
)
)
.Size(pageSize)
.Explain()
);

最佳答案

您要执行的是对 Elasticsearch 中 Year 字段的 term 查询

var response = client.Search<ElasticListing>(s => s
.AllTypes()
.Query(query => query
.Term(f => f.Year, 2014)
)
.Size(pageSize)
.Explain()
);

看看 writing queries section的文档。

为了对Year 字段执行通配符查询,需要将其索引为keyword data type。 (keyword 不在索引时分析输入,这可能是我们希望将数值索引为“字符串”)。

默认情况下,NEST 会将 Year 字段序列化为 JSON 中的数字,而 Elasticsearch 会将此映射推断为数字数据类型。即使使用 NEST 的 automapping , NEST 将推断 Yearinteger 数据类型映射,以匹配属性的 CLR 类型 Int32。因此,我们需要覆盖此推断映射以确保 Year 被索引为 keyword 数据类型。

这是一个完整的例子

private static void Main()
{
var defaultIndex = "listings";
var settings = new ConnectionSettings(new Uri("http://localhost:9200"))
.DefaultIndex(defaultIndex);

var client = new ElasticClient(settings);

// Make this example re-runnable. You likely want to remove this :)
if (client.IndexExists(defaultIndex).Exists)
client.DeleteIndex(defaultIndex);

client.CreateIndex(defaultIndex, c => c
.Mappings(m => m
.Map<ElasticListing>(mm => mm
.AutoMap()
.Properties(p => p
// override the default inferred mapping for Year
.Keyword(k => k
.Name(n => n.Year)
)
)
)
)
);

client.IndexMany(new [] {
new ElasticListing { Id = 1, Year = 2012 },
new ElasticListing { Id = 2, Year = 2013 },
new ElasticListing { Id = 3, Year = 2014 },
new ElasticListing { Id = 4, Year = 1014 },
});

client.Refresh(defaultIndex);

var pageSize = 10;

// returns only document with Id = 3
var response = client.Search<ElasticListing>(s => s
.AllTypes()
.Query(query => query
.Term(f => f.Year, 2014)
)
.Size(pageSize)
.Explain()
);

// returns documents with Ids = 3 and 4
response = client.Search<ElasticListing>(s => s
.AllTypes()
.Query(query => query
.Wildcard(f => f.Year, "*14", rewrite:(MultiTermQueryRewrite)null)
)
.Size(pageSize)
.Explain()
);
}

public class ElasticListing
{
public long Id { get; set; }
public string Brand { get; set; }
public string Manufacturer { get; set; }
public string ActiveTags { get; set; }
public string Description { get; set; }
public int Year { get; set; }
public string Location { get; set; }
}

关于ElasticSearch (NEST) 按数字搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48798891/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com