我们有一个弹性搜索5.5设置。我们使用nest通过C#执行查询。
执行以下查询时:
{
"query": {
"bool": {
"must": [
{
"query_string": {
"query": "00917751"
}
}
]
}
}
}
我们得到了想要的结果:一个带有该数字作为标识符的结果。
执行查询时:
{
"query": {
"bool": {
"must": [
{
"query_string": {
"query": "917751"
}
}
]
}
}
}
我们没有得到任何结果。
我们正在搜索的值位于搜索信息字段中,值为“1-00917751”。
我们有一个名为“最终”的定制分析仪
.自定义(“最终”,cu=
字段SearchIdentifier上未设置自定义分析器。我尝试在其中添加空白标记器,但没有什么不同。
当我尝试使用查询“S328”搜索值“S328-25”时,另一个名为“search chObjectNo”的字段确实有效。这些字段完全相同。
有什么想法吗?
另一个相关问题:执行查询时
{
"query": {
"bool": {
"must": [
{
"query_string": {
"query": "1-00917751"
}
}
]
}
}
}
我们得到了很多结果。我希望这只返回1个结果。我们将如何做到这一点?
谢谢你斯科夫
设置和映射:https://jsonblob.com/9dbf33f6-cd3e-11e8-8f17-c9de91b6f9d1
SearchIdentifier字段映射为文本数据类型,默认情况下将进行分析并使用标准分析器。使用Analyze API,您可以看到哪些术语将存储在1-00917751的反向索引中
var client = new ElasticClient();
var analyzeResponse = client.Analyze(a => a
.Text("1-00917751")
);
它返回
{
"tokens" : [
{
"token" : "1",
"start_offset" : 0,
"end_offset" : 1,
"type" : "<NUM>",
"position" : 0
},
{
"token" : "00917751",
"start_offset" : 2,
"end_offset" : 10,
"type" : "<NUM>",
"position" : 1
}
]
}
您将获得查询输入为00917751的查询的匹配项,因为这匹配在索引时对输入进行分析后存储在反向索引中的一个项。
您将无法获得917751的匹配项,因为反向索引中没有匹配的项。您可以定义一个分析链,从数字中删除前导零,并保留原始标记,例如。
private static void Main()
{
var defaultIndex = "foobarbaz";
var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
var settings = new ConnectionSettings(pool)
.DefaultIndex(defaultIndex);
var client = new ElasticClient(settings);
client.CreateIndex(defaultIndex, c => c
.Settings(s => s
.Analysis(a => a
.Analyzers(an => an
.Custom("trim_leading_zero", ca => ca
.Tokenizer("standard")
.Filters(
"standard",
"lowercase",
"trim_leading_zero",
"trim_zero_length")
)
)
.TokenFilters(tf => tf
.PatternReplace("trim_leading_zero", pr => pr
.Pattern("^0+(.*)")
.Replacement("$1")
)
.Length("trim_zero_length", t => t
.Min(1)
)
)
)
)
.Mappings(m => m
.Map<MyDocument>(mm => mm
.AutoMap()
.Properties(p => p
.Text(t => t
.Name(n => n.SearchIndentifier)
.Analyzer("trim_leading_zero")
.Fields(f => f
.Keyword(k => k
.Name("keyword")
.IgnoreAbove(256)
)
)
)
)
)
)
);
client.Index(new MyDocument { SearchIndentifier = "1-00917751" }, i => i
.Refresh(Refresh.WaitFor)
);
client.Search<MyDocument>(s => s
.Query(q => q
.QueryString(qs => qs
.Query("917751")
)
)
);
}
public class MyDocument
{
public string SearchIndentifier { get; set; }
}
模式替换令牌过滤器将修剪令牌的前导零。
搜索查询返回索引文档
{
"took" : 69,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"skipped" : 0,
"failed" : 0
},
"hits" : {
"total" : 1,
"max_score" : 0.33310556,
"hits" : [
{
"_index" : "foobarbaz",
"_type" : "mydocument",
"_id" : "MVF4bmYBJZHQAT-BUx1K",
"_score" : 0.33310556,
"_source" : {
"searchIndentifier" : "1-00917751"
}
}
]
}
}
实现此功能的推荐方法是什么?注意,我使用的是查询字符串查询。
我们有一个弹性搜索5.5设置。我们使用nest通过C#执行查询。 执行以下查询时: 我们得到了想要的结果:一个带有该数字作为标识符的结果。 使用以下查询时: 我们没有结果。 我们正在搜索的值位于搜索信息字段中,值为“1-00917751”。 我们有一个名为“最终”的定制分析仪 .自定义(“最终”,cu= 字段搜索识别器没有设置自定义分析器。我们尝试在其中添加空白标记器,但没有任何区别。 当我们试图
创建新的。NET Framework 4.6.1控制台应用程序 为NEST 6.5.0和ElasticSearch.NET 6.5.0添加NuGet包 然后,我创建了一个新的弹性索引,其中包含具有“tags”属性的对象(类型为“mything”)。此标记是一组可能值中的随机逗号分隔的单词集。在测试中,我在索引中插入了100到5000项。我试了越来越少的可能的词在设置。
下面的lucene查询返回空字符串请帮忙,提前谢谢
在我的弹性搜索数据库中插入6条记录后,我正在尝试一个弹性搜索示例。
因此,默认情况下,field1是通过使用默认分析器进行弹性搜索来分析的。 我在下面搜索短语查询,但它没有返回任何结果。 因此弹性搜索短语查询不适合于OR运算符。知道为什么它不起作用吗?它是弹性搜索的一个限制,因为文本中有特殊的字符连字符(-)?