问题描述
public class items
{
public string item_no { get; set; }
public string category { get; set; }
public int campaign { get; set; }
public int in_stock { get; set; }
// Next properties only include [a-z0-9]. Not any other characters
public string search_item_no { get; set; }
public string search_group_one { get; set; }
public string search_group_two { get; set; }
public string search_description { get; set; }
public string search_all_fields { get; set; } /* search_item_no + search_group_one + search_group_two + search_description and something else */
}
public class ClassForscore
{
public int id { get; set; }
public string item_no { get; set; }
}
item_no # category # campaign # in_stock # search_item_no # search_group_one # search_group_two # search_description # search_all_fields
p-C-001 # cat1 # 1 # 1 # pc001 # aaaa@bbb@ccc # kkkkk@llllllll # red@Metal@light # pc001@aaaa@bbb@ccc@kkkkk@llllllll@red@Metal@light
p-F-002 # cat1 # 1 # 1 # pf002 # ck001@www@zza # yyy@rrrr@mmplp # bold@plastic@ss # pf002@ck001@www@zza@yyy@rrrr@mmplp@bold@plastic@ss
p-SW102 # cat2 # 0 # 1 # psw102 # psw102@777@ooo # yyy@rrrr@mmplp # bold@plastic@cc # psw102@777@ooo@www@zza@yyy@rrrr@mmplp@bold@plastic@cc
我找不到类似的问题。我做错了什么,或者我不知道如何搜索。
我的索引就是这样
例如,用户搜索“ c 001”,我查看search_all_fields并在两个文档中找到它。 (对所有搜索关键字“ c ”和“ 001 ”进行通配符查询) 但是第二个是没有用的。因为第一个与item_no匹配。这更有价值。 第二个与group_one字段匹配。这是不太有价值的。 我必须过滤它。
但是,另一方面,有人搜索“ yyy 102”,则仅在group_one和group 2字段中发生。 所以我一定不要过滤它。
进行两次弹性得分是很昂贵的。但是我该如何实现呢?
QueryContainer queryContainsOr = new WildcardQuery() { Field = "score_all_fields",Value = "*yyy*" };
queryContainsOr |= new WildcardQuery() { Field = "score_all_fields",Value = "*102*" };
QueryContainer queryEqualsOr = new TermQuery() { Field = "category",Value = "cat1" };
queryEqualsOr |= new TermQuery() { Field = "category",Value = "cat2" };
QueryContainer queryEqualsAnd = new TermQuery() { Field = "campaign",Value = 1 };
queryEqualsAnd &= new TermQuery() { Field = "in_stock",Value = 1 };
QueryContainer mainQuery = queryContainsOr & queryEqualsAnd & queryEqualsOr;
Func<QueryContainerDescriptor<ClassForscore>,QueryContainer> fo = funcscoreParam(new ClassForscore(),filterItemNo,filterGroupOne,filterGroupTwo,filterDescription,mainQuery);
ISearchResponse<ClassForscore> srcSkor = elasticclient.Search<ClassForscore>(s => s
.RequestConfiguration(r => r.disableDirectStreaming())
.Query(fo)
.Size(100)
);
IReadOnlyCollection<IHit<ClassForscore>> lstSkor = srcSkor.Hits;
double? dblSkorAvg = 0;
// Some calculation..
//.....
Func<QueryContainerDescriptor<items>,QueryContainer> fo2 = funcscoreParam(new ClassForscore(),mainQuery);
ISearchResponse<items> srcResult = elasticclient.Search<items>(s => s
.RequestConfiguration(r => r.disableDirectStreaming())
.From(0)
.Size(100)
.sort(S => S.Descending(SortSpecialField.score).Ascending(r => r.item_no))
.Minscore(dblSkorAvg)
.Query(fo2)
);
private Func<QueryContainerDescriptor<T>,QueryContainer> funcscoreParam<T>(T nesne,QueryContainer filterItemNo,QueryContainer filterGroupOne,QueryContainer filterGroupTwo,QueryContainer filterDescription,QueryContainer mainQuery) where T : class
{
return new Func<QueryContainerDescriptor<T>,QueryContainer>(q => q
.Functionscore(fsc => fsc
.BoostMode(FunctionBoostMode.Sum)
.scoreMode(FunctionscoreMode.Sum)
.Functions(fu => fu
.Weight(w => w
.Weight(1000)
.Filter(wf => wf
.Bool(bb => bb
.Must(filterItemNo))
))
.Weight(w => w
.Weight(100)
.Filter(wf => wf
.Bool(bb => bb
.Must(filterGroupOne))
))
.Weight(w => w
.Weight(100)
.Filter(wf => wf
.Bool(bb => bb
.Must(filterGroupTwo))
))
.Weight(w => w
.Weight(50)
.Filter(wf => wf
.Bool(bb => bb
.Must(filterDescription))
))
)
.Query(q2 => q2
.Bool(b => b
.Should(mainQuery))
)
));
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)