- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建一个为用户和组提供自动完成建议的组件。我正在使用elasticsearch 6.5.3。我创建了一个索引,其中包含我要搜索的字段以及3个其他字段,以供根据(isGroup,isUser,organizationId)进行过滤。在某些情况下,我想使用此组件搜索所有用户和组,有时仅搜索用户或组,或者仅搜索属于特定组织的用户。我打算根据具体用例提供一个过滤器以及搜索词。我正在使用nest进行搜索,但是我不知道该怎么做。是否可以这样做,如果可以,怎么做?我为此走错了路吗?我主要按照guide创建分析器和东西。我可以发布索引,如果有帮助的话,但是有点长。
这是一个搜索,其中返回了两个项目。
return client.Search<UserGroupDocument>(s => s
.Query(q=>q
.QueryString(qs=>qs.Query("adm"))
)
);
{
"_index": "users_and_groups_autocomplete_index",
"_type": "usergroupdocument",
"_id": "c54956ab-c50e-481c-b093-f9855cc74480",
"_score": 2.2962174,
"_source": {
"id": "c54956ab-c50e-481c-b093-f9855cc74480",
"isUser": true,
"isGroup": false,
"name": "admin",
"email": "admin@snapshotdesign.com",
"organizationId": 2
}
},
{
"_index": "users_and_groups_autocomplete_index",
"_type": "usergroupdocument",
"_id": "80f98d24-39e3-475d-9cb6-8f16ca472525",
"_score": 0.8630463,
"_source": {
"id": "80f98d24-39e3-475d-9cb6-8f16ca472525",
"isUser": false,
"isGroup": true,
"name": "new Group",
"users": [
{
"name": "Test User 1",
"email": "test@example.com"
},
{
"name": "admin",
"email": "admin@snapshotdesign.com"
}
],
"organizationId": 0
}
},
public class UserGroupDocument
{
public string Id { get; set; }
public bool IsUser { get; set; }
public bool IsGroup { get; set; }
public string Name { get; set; }
public string Email { get; set; }
public List<User> Users { get; set; }
public long OrganizationId { get; set; }
}
public class User
{
public string Name { get; set; }
public string Email { get; set; }
}
.Must(mu => mu
.QueryString(mmp => mmp
.Query(searchTerms)
.Fields(f => f
.Field(ff => ff.Name)
.Field(ff => ff.Users.Suffix("name"))
)
)
)
{
"users_and_groups_autocomplete_index": {
"aliases": {},
"mappings": {
"usergroupdocument": {
"properties": {
"email": {
"type": "text",
"fields": {
"autocomplete": {
"type": "text",
"analyzer": "autocomplete"
}
}
},
"id": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword",
"ignore_above": 256
}
}
},
"isGroup": {
"type": "boolean"
},
"isUser": {
"type": "boolean"
},
"name": {
"type": "text",
"fields": {
"autocomplete": {
"type": "text",
"analyzer": "autocomplete"
}
}
},
"organizationId": {
"type": "long"
},
"users": {
"properties": {
"email": {
"type": "text",
"fields": {
"autocomplete": {
"type": "text",
"analyzer": "autocomplete"
}
}
},
"name": {
"type": "text",
"fields": {
"autocomplete": {
"type": "text",
"analyzer": "autocomplete"
}
}
}
}
}
}
}
},
"settings": {
"index": {
"number_of_shards": "5",
"provided_name": "users_and_groups_autocomplete_index",
"creation_date": "1548363729311",
"analysis": {
"analyzer": {
"autocomplete": {
"filter": [
"lowercase"
],
"type": "custom",
"tokenizer": "autocomplete"
}
},
"tokenizer": {
"autocomplete": {
"token_chars": [
"digit",
"letter"
],
"min_gram": "1",
"type": "edge_ngram",
"max_gram": "20"
}
}
},
"number_of_replicas": "1",
"uuid": "Vxv-y58qQTG8Uh76Doi_dA",
"version": {
"created": "6050399"
}
}
}
}
}
最佳答案
您正在寻找一种将多个查询组合在一起的方法:
isGroup
isUser
organizationId
bool
query)进入的地方。给出以下POCO
public class UserGroupDocument
{
public string Name { get; set; }
public bool IsGroup { get; set; }
public bool IsUser { get; set; }
public string OrganizationId { get; set; }
}
private static void Main()
{
var defaultIndex = "default-index";
var pool = new SingleNodeConnectionPool(new Uri("http://localhost:9200"));
var settings = new ConnectionSettings(pool)
.DefaultIndex(defaultIndex);
var client = new ElasticClient(settings);
var isUser = true;
var isGroup = true;
var organizationId = "organizationId";
var searchResponse = client.Search<UserGroupDocument>(x => x
.Index(defaultIndex)
.Query(q => q
.Bool(b => b
.Must(mu => mu
.QueryString(mmp => mmp
.Query("some admin")
.Fields(f => f
.Field(ff => ff.Name)
)
)
)
.Filter(fi =>
{
if (isUser)
{
return fi
.Term(f => f.IsUser, true);
}
return null;
}, fi =>
{
if (isGroup)
{
return fi
.Term(f => f.IsGroup, true);
}
return null;
}, fi => fi
.Term(f => f.OrganizationId, organizationId)
)
)
)
);
}
POST http://localhost:9200/default-index/usergroupdocument/_search
{
"query": {
"bool": {
"filter": [
{
"term": {
"isUser": {
"value": true
}
}
},
{
"term": {
"isGroup": {
"value": true
}
}
},
{
"term": {
"organizationId": {
"value": "organizationId"
}
}
}
],
"must": [
{
"query_string": {
"fields": [
"name"
],
"query": "some admin"
}
}
]
}
}
}
isUser
是false
,term
字段上的isUser
查询过滤器将不包含在搜索查询isGroup
是false
,term
字段上的isGroup
查询过滤器将不包含在搜索查询organizationId
是null
或空字符串,搜索查询中将不包括term
上的organizationId
查询过滤器。 isGroup
和
isUser
设为可空的 bool(boolean) 值(
bool?
)。然后,当其中一个值为
null
时,相应的
term
查询过滤器将不包含在发送给Elasticsearch的搜索查询中。这利用了Nest中称为无条件查询的功能,该功能旨在简化编写更复杂的查询的过程。另外,我们可以使用
operator overloading on queries来简化
bool
查询的编写。这一切都意味着我们可以将查询细化为
bool? isUser = true;
bool? isGroup = true;
var organizationId = "organizationId";
var searchResponse = client.Search<UserGroupDocument>(x => x
.Index(defaultIndex)
.Query(q => q
.QueryString(mmp => mmp
.Query("some admin")
.Fields(f => f
.Field(ff => ff.Name)
)
) && +q
.Term(f => f.IsUser, isUser) && +q
.Term(f => f.IsGroup, isGroup) && +q
.Term(f => f.OrganizationId, organizationId)
)
);
关于elasticsearch - 如何使用Elasticsearch过滤查询结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54349047/
我在这里有一个问题,我不知道这是否正常。 但是我认为这里有些湖,安装插件elasticsearch-head之后,我在浏览器中启动url“http://localhost:9200/_plugin/h
我写了这个 flex 搜索查询: es.search(index=['ind1'],doc_type=['doc']) 我得到以下结果: {'_shards': {'failed': 0, 'skip
在ElasticSearch.Net v.5中,存在一个属性 Elasticsearch.Net.RequestData.Path ,该属性在ElasticSearch.Net v.6中已成为depr
如何让 elasticsearch 应用新配置?我更改了文件 ~ES_HOME/config/elasticsearch.yml 中的一个字符串: # Disable HTTP completely:
我正在尝试使用以下分析器在 elastic serach 7.1 中实现部分子字符串搜索 PUT my_index-001 { "settings": { "analysis": {
假设一个 elasticsearch 服务器在很短的时间内接收到 100 个任务。有些任务很短,有些任务很耗时,有些任务是删除任务,有些是插入和搜索查询。 elasticsearch 是如何决定先运行
我需要根据日期过滤一组值(在此处添加字段),然后按 device_id 对其进行分组。所以我正在使用以下东西: { "aggs":{ "dates_between":{ "fi
我在 Elasticsearch 中有一个企业索引。索引中的每个文档代表一个业务,每个业务都有business_hours。我试图允许使用星期几和时间过滤营业时间。例如,我们希望能够进行过滤,以显示我
我有一个这样的过滤查询 query: { filtered: { query: { bool: { should: [{multi_match: {
Elasticsearch 相当新,所以可能不得不忍受我,我遇到了一个问题,如果我使用 20 个字符或更少的字符搜索文档,文档会出现,但是查询中同一个单词中的任何更多字符,我没有结果: 使用“苯氧甲基
我试图更好地理解 ElasticSearch 的内部结构,所以我想知道 ElasticSearch 在内部计算以下两种情况的术语统计信息的方式是否存在任何差异。 第一种情况是当我有这样的文件时: {
在我的 elasticsearch 索引中,我索引了一堆工作。为简单起见,我们只说它们是一堆职位。当人们在我的搜索引擎中输入职位时,我想“自动完成”可能的匹配。 我在这里调查了完成建议:http://
我在很多映射中使用多字段。在 Elastic Search 的文档中,指示应将多字段替换为“fields”参数。参见 http://www.elasticsearch.org/guide/en/ela
我有如下查询, query = { "query": {"query_string": {"query": "%s" % q}}, "filter":{"ids
我有一个Json数据 "hits": [ { "_index": "outboxprov1", "_type": "deleted-c
这可能是一个初学者的问题,但我对大小有一些疑问。 根据 Elasticsearch 规范,大小的最大值可以是 10000,我想在下面验证我的理解: 示例查询: GET testindex-2016.0
我在 Elastic Search 中发现了滚动功能,这看起来非常有趣。看了那么多文档,下面的问题我还是不清楚。 如果偏移量已经存在那么为什么要使用滚动? 即将到来的记录呢?假设它完成了所有数据的滚动
我有以下基于注释的 Elasticsearch 配置,我已将索引设置为不被分析,因为我不希望这些字段被标记化: @Document(indexName = "abc", type = "efg
我正在尝试在单个索引中创建多个类型。例如,我试图在host索引中创建两种类型(post,ytb),以便在它们之间创建父子关系。 PUT /ytb { "mappings": { "po
我尝试创建一个简单的模板,包括一些动态模板,但我似乎无法为文档编制索引。 我得到错误: 400 {"error":"MapperParsingException[mapping [_default_]
我是一名优秀的程序员,十分优秀!