我们有一个弹性的搜索5.5的设置。 我们利用通过嵌套C#来执行我们的查询。
当执行以下查询:
{ "query": { "bool": { "must": [ { "query_string": { "query": "00917751" } } ] } } }
我们得到期望的结果:与作为标识的头号结果。
当执行查询:
{ "query": { "bool": { "must": [ { "query_string": { "query": "917751" } } ] } } }
我们没有结果。
我们正在寻找的值是在该领域searchIndentifier,和值为“1-00917751”。
我们已经调用自定义分析“最终”
.Custom( “最终”,铜=>立方米.Tokenizer( “关键字”)。过滤器(新列表(){ “小写”}))
现场searchIndentifier上有没有设定自定义分析。 我尝试添加在它的空白标记生成器但没有什么区别。
所谓“searchObjectNo”另一个领域做工作,当我尝试搜索的值“S328-25”与查询“S328”。 这些字段是完全一样的。
这里的任何想法?
另一个相关的问题:当执行查询
{ "query": { "bool": { "must": [ { "query_string": { "query": "1-00917751" } } ] } } }
我们得到了不少成果。 我想这回只有1条结果。 我们将如何做到这一点?
谢谢Schoof
设置和映射: https://jsonblob.com/9dbf33f6-cd3e-11e8-8f17-c9de91b6f9d1
该searchIndentifier
字段映射为text
数据类型,将进行分析,并默认使用标准分析器。 使用分析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
}
]
}
你会得到的匹配query_string
用的查询输入查询00917751
,因为这符合存储在倒排索引的索引时间分析输入的结果,其中一项条款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; }
}
该pattern_replacement
令牌过滤器将令牌修剪前导零。
搜索查询返回的索引文件
{
"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"
}
}
]
}
}