大多数字段 multi_match 除一个字段外的所有字段都模糊
MostFields multi_match fuzziness on all but one field
我有几个不同的字段映射。我有一个拼音字段。我想做一个带模糊的查询,但不在拼音字段上使用模糊。
...
_client.Search<JobModelSummary>(s => s
.Index(indexName)
.Query(q => q
.MultiMatch(m => m
.Query(paginationQuery.Search)
.Type(TextQueryType.MostFields)
.Fuzziness(Fuzziness.EditDistance(1))
.Fields(f => f
.Field(ff => ff.Name.Suffix("standard"), 3)
.Field(ff => ff.Name.Suffix("edge-ngram"), 2)
.Field(ff => ff.Name.Suffix("phonetic")) // <--- Don't want this fuzzy
))));
文档很少,我发现很难和平共处。
如果您像上面那样执行最多字段 multi_match 查询,您可以通过将多个匹配查询组合在一起来实现您想要的结果
var indexName = "foo";
var search = "search";
var searchResponse client.Search<JobModelSummary>(s => s
.Index(indexName)
.Query(q => q
.Bool(b => b
.Should(sh => sh
.Match(m => m
.Query(search)
.Fuzziness(Fuzziness.EditDistance(1))
.Field(ff => ff.Name.Suffix("standard"))
.Boost(3)
), sh => sh
.Match(m => m
.Query(search)
.Fuzziness(Fuzziness.EditDistance(1))
.Field(ff => ff.Name.Suffix("edge-ngram"))
.Boost(2)
), sh => sh
.Match(m => m
.Query(search)
.Field(ff => ff.Name.Suffix("phonetic"))
)
)
)
)
);
使用查询的重载运算符可以稍微简洁一些
client.Search<JobModelSummary>(s => s
.Index(indexName)
.Query(q => q
.Match(m => m
.Query(search)
.Fuzziness(Fuzziness.EditDistance(1))
.Field(ff => ff.Name.Suffix("standard"))
.Boost(3)
) || q
.Match(m => m
.Query(search)
.Fuzziness(Fuzziness.EditDistance(1))
.Field(ff => ff.Name.Suffix("edge-ngram"))
.Boost(2)
) || q
.Match(m => m
.Query(search)
.Field(ff => ff.Name.Suffix("phonetic"))
)
)
);
两者都产生
POST http://localhost:9200/foo/jobmodelsummary/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"name.standard": {
"boost": 3.0,
"query": "search",
"fuzziness": 1
}
}
},
{
"match": {
"name.edge-ngram": {
"boost": 2.0,
"query": "search",
"fuzziness": 1
}
}
},
{
"match": {
"name.phonetic": {
"query": "search"
}
}
}
]
}
}
}
should 子句中每个查询的分数将加在一起,以提供每个文档的最终 _score
。仅指定了 should 子句,至少有一个匹配才能将文档视为匹配项。
我有几个不同的字段映射。我有一个拼音字段。我想做一个带模糊的查询,但不在拼音字段上使用模糊。
...
_client.Search<JobModelSummary>(s => s
.Index(indexName)
.Query(q => q
.MultiMatch(m => m
.Query(paginationQuery.Search)
.Type(TextQueryType.MostFields)
.Fuzziness(Fuzziness.EditDistance(1))
.Fields(f => f
.Field(ff => ff.Name.Suffix("standard"), 3)
.Field(ff => ff.Name.Suffix("edge-ngram"), 2)
.Field(ff => ff.Name.Suffix("phonetic")) // <--- Don't want this fuzzy
))));
文档很少,我发现很难和平共处。
如果您像上面那样执行最多字段 multi_match 查询,您可以通过将多个匹配查询组合在一起来实现您想要的结果
var indexName = "foo";
var search = "search";
var searchResponse client.Search<JobModelSummary>(s => s
.Index(indexName)
.Query(q => q
.Bool(b => b
.Should(sh => sh
.Match(m => m
.Query(search)
.Fuzziness(Fuzziness.EditDistance(1))
.Field(ff => ff.Name.Suffix("standard"))
.Boost(3)
), sh => sh
.Match(m => m
.Query(search)
.Fuzziness(Fuzziness.EditDistance(1))
.Field(ff => ff.Name.Suffix("edge-ngram"))
.Boost(2)
), sh => sh
.Match(m => m
.Query(search)
.Field(ff => ff.Name.Suffix("phonetic"))
)
)
)
)
);
使用查询的重载运算符可以稍微简洁一些
client.Search<JobModelSummary>(s => s
.Index(indexName)
.Query(q => q
.Match(m => m
.Query(search)
.Fuzziness(Fuzziness.EditDistance(1))
.Field(ff => ff.Name.Suffix("standard"))
.Boost(3)
) || q
.Match(m => m
.Query(search)
.Fuzziness(Fuzziness.EditDistance(1))
.Field(ff => ff.Name.Suffix("edge-ngram"))
.Boost(2)
) || q
.Match(m => m
.Query(search)
.Field(ff => ff.Name.Suffix("phonetic"))
)
)
);
两者都产生
POST http://localhost:9200/foo/jobmodelsummary/_search
{
"query": {
"bool": {
"should": [
{
"match": {
"name.standard": {
"boost": 3.0,
"query": "search",
"fuzziness": 1
}
}
},
{
"match": {
"name.edge-ngram": {
"boost": 2.0,
"query": "search",
"fuzziness": 1
}
}
},
{
"match": {
"name.phonetic": {
"query": "search"
}
}
}
]
}
}
}
should 子句中每个查询的分数将加在一起,以提供每个文档的最终 _score
。仅指定了 should 子句,至少有一个匹配才能将文档视为匹配项。