elasticsearch 多条件搜索语句怎么写
发布网友
发布时间:2022-04-19 09:57
我来回答
共5个回答
懂视网
时间:2022-05-06 17:39
首先我们来看看为什么存在这些问题,以及如何解决它们。
问题1:在多个字段中匹配相同的单词
考虑一下most_fields查询是如何执行的:ES会为每个字段生成一个match查询,让后将它们包含在一个bool查询中。
我们可以将查询传入到validate-query API中进行查看:
GET /_validate/query?explain
{
"query": {
"multi_match": {
"query": "Poland Street W1V",
"type": "most_fields",
"fields": [ "street", "city", "country", "postcode" ]
}
}
}
它会产生下面的解释(explaination):
(street:poland street:street street:w1v) (city:poland city:street city:w1v) (country:poland country:street country:w1v) (postcode:poland postcode:street postcode:w1v)
你可以发现能够在两个字段中匹配poland的文档会比在一个字段中匹配了poland和street的文档的分值要高。
问题2:减少长尾
在精度控制(Controlling Precision)一节中,我们讨论了如何使用and操作符和minimum_should_match参数来减少相关度低的文档数量:
{
"query": {
"multi_match": {
"query": "Poland Street W1V",
"type": "most_fields",
"operator": "and",
"fields": [ "street", "city", "country", "postcode" ]
}
}
}
但是,使用best_fields或者most_fields,这些参数会被传递到生成的match查询中。该查询的解释如下(译注:通过validate-query API):
(+street:poland +street:street +street:w1v) (+city:poland +city:street +city:w1v) (+country:poland +country:street +country:w1v) (+postcode:poland +postcode:street +postcode:w1v)
换言之,使用and操作符时,所有的单词都需要出现在相同的字段中,这显然是错的!这样做可能不会有任何匹配的文档。
问题3:词条频度
在什么是相关度(What is Relevance)一节中,我们解释了默认用来计算每个词条的相关度分值的相似度算法TF/IDF:
词条频度(Term Frequency)
在一份文档中,一个词条在一个字段中出现的越频繁,文档的相关度就越高。
倒排文档频度(Inverse Document Frequency)
一个词条在索引的所有文档的字段中出现的越频繁,词条的相关度就越低。
当通过多字段进行搜索时,TF/IDF会产生一些令人惊讶的结果。
考虑使用first_name和last_name字段搜索"Peter Smith"的例子。Peter是一个常见的名字,Smith是一个常见的姓氏 - 它们的IDF都较低。但是如果在索引中有另外一个名为Smith Williams的人呢?Smith作为名字是非常罕见的,因此它的IDF值会很高!
像下面这样的一个简单查询会将Smith Williams放在Peter Smith前面(译注:含有Smith Williams的文档分值比含有Peter Smith的文档分值高),尽管Peter Smith明显是更好的匹配:
{
"query": {
"multi_match": {
"query": "Peter Smith",
"type": "most_fields",
"fields": [ "*_name" ]
}
}
}
smith在first_name字段中的高IDF值会压倒peter在first_name字段和smith在last_name字段中的两个低IDF值。
解决方案
这个问题仅在我们处理多字段时存在。如果我们将所有这些字段合并到一个字段中,该问题就不复存在了。我们可以向person文档中添加一个full_name字段来实现:
{
"first_name": "Peter",
"last_name": "Smith",
"full_name": "Peter Smith"
}
当我们只查询full_name字段时:
拥有更多匹配单词的文档会胜过那些重复出现一个单词的文档。minimum_should_match和operator参数能够正常工作。first_name和last_name的倒排文档频度会被合并,因此smith无论是first_name还是last_name都不再重要。
尽管这种方法能工作,可是我们并不想存储冗余数据。因此,ES为我们提供了两个解决方案 - 一个在索引期间,一个在搜索期间。下一节对它们进行讨论。
热心网友
时间:2022-05-06 14:47
Elasticsearch是一个高伸缩、高可用、基于ApacheLucene的开源搜索与分析引擎。通过它你可以很方便地对数据进行深入挖掘,可以随时放大与缩小搜索与分析的区间,并且这一切都是实时的。为了提供了一个优秀的用户体验,我们对Elasticsearch投入了很大的精力。Elasticsearch本身的各种选项已有了良好的默认值,使用户能够更方便地上手。但我们也为用户提供了全方面的选项,在必要的情况下,可以对该引擎的几乎每个方面进行定制。举例来说,当你使用它搜索数据的时候,可以使用传统的查询(‘查找满足条件Y的所有项X’)进行过滤(在Elasticsearch术语中称为逗视图地),高亮显示搜索片段,为每条结果提供相应的上下文。也可以使用地理位置(‘查找在Z里之内的所有项’),或是为用户提供搜索关键字建议,并且提供了强大的聚合(即Elasticsearch中的逗分面地(facet))能力,例如时间分布图或者统计图。Elasticsearch既可以搜索、也可以保存数据。它提供了一种半结构化、不依赖schema并且基于JSON的模型,你可以直接传入原始的JSON文档,Elasticsearch会自动地检测出你的数据类型,并对文档进行索引。你也可以对schema映射进行定制,以实现你的目的,例如对单独的字段或文档进行boost映射,或者是定制全文搜索的分析方式等等。你既可以在自己的膝上电脑中启用一个小型实例,也可以在云端启用几十乃至几百个实例,只需要一些极小的改变而已。Elasticsearch会自动进行横向扩展,它能够随着你的应用一起成长。Elasticsearch运行在JVM之上,它使用JSON格式,通过RESTfulHTTP接口的方式访问,因此任何一种客户端或语言都能够与其交互。目前已经有了大量的客户端和框架的整合方案,包括对多种编程语言的支持,通过这些原生的API与专门的DSL将不一致的地方最小化,并实现性能最大化。Elasticsearch非常适合于大数据的场合,它的高伸缩性与分布式架构的本质使得对大量信息的搜索与存储都可以在近乎实时的情况下完成。通过Elasticsearch-Hadoop这个项目,我们使Hadoop使用者(这里也包括Hive、Pig和Cascading)能够用一个成熟的搜索引擎来增强他们的工作流。我们还为他们提供了一种丰富的语言,能够让他们更好地表达意图,因而更准确地获得想要的结果,并且速度也大大提高了。追问RESTful API 的json
怎么写这个语句呢
热心网友
时间:2022-05-06 16:05
以下代码是动态构建查询语句:
[java] view plain copy private SearchRequestBuilder dynamicSearch(String index, String type, String startTime, String endTime, String status, String title, String city, String resOfficer, int pageIndex, int pageCapacity) { SearchRequestBuilder searchRequestBuilder = client.prepareSearch(index) .setTypes(type) .setSearchType(SearchType.DFS_QUERY_THEN_FETCH) .setPostFilter(FilterBuilders.rangeFilter("start_time").from(startTime).to(endTime)) .setFrom(pageIndex).setSize(pageCapacity) .setExplain(true); BoolQueryBuilder queryBuilder = QueryBuilders.boolQuery(); queryBuilder.mustNot(QueryBuilders.matchQuery("site", "www.huodongxing.com")); //活动名称 if (!StringUtils.isEmpty(title)) { queryBuilder.must(QueryBuilders.queryString(title).field("title")); } //城市 if (!StringUtils.isEmpty(city)) { queryBuilder.must(termQuery("city", city)); } //业务状态 if (!StringUtils.isEmpty(status)) { if (status.equals(BusinessStatus.REJECTED.getCode()) || status.equals(BusinessStatus.COOPERATED.getCode())) { queryBuilder.must(termQuery("bus_status", status)); } } //负责人 if (!StringUtils.isEmpty(resOfficer)) { queryBuilder.must(queryString(resOfficer).field("resOfficer")); } if (StringUtils.isEmpty(title) && StringUtils.isEmpty(city) && StringUtils.isEmpty(status) && StringUtils.isEmpty(resOfficer)) { searchRequestBuilder.setQuery(matchAllQuery()); } searchRequestBuilder.setQuery(queryBuilder); return searchRequestBuilder; }追问请问你懂
基于JSON 的RESTful API写法吗 我没有学过java
热心网友
时间:2022-05-06 17:40
{
"query": {
"bool": {
"filter": {
"bool": {
"must": [{
"term": {
"name": "john"
}
},
{
"term": {
"sex": "男"
}
},
{
"rang": {
"age": {
"gt": 10,
"lt": 30
}
}
}
]
}
}
}
}
}
热心网友
时间:2022-05-06 19:31
。。。我看下面的回答。。。现在会写了吗?
elasticsearch 多条件搜索语句怎么写
举例来说,当你使用它搜索数据的时候,可以使用传统的查询(‘查找满足条件Y的所有项X’)进行过滤(在Elasticsearch术语中称为逗视图地),高亮显示搜索片段,为每条结果提供相应的上下文。也可以使用地理位置(‘查找在Z里之内的所有项’),或是为用户提供搜索关键字建议,并且提供了强大的聚合(即Elasti...
elasticsearch如何实现多字段条件列表查询?
首先,must 参数用于确保文档必须满足指定的条件才能被包含在查询结果中。其次,must_not 参数则用于排除那些不满足指定条件的文档。接着,should 参数的用意在于,如果文档满足这些语句中的任意一条,将增加其 _score 值,从而提升其在搜索结果中的排名。最后,filter 参数用于强制文档匹配特定条件,但不参...
elasticsearch 怎么同时检索单 field 多个值的条件
"minimum_match" : 1 } } } 上述查询返回在tags字段中包含一个或两个搜索词条的所有文档。为什么?这是因为我们把minimum_match属性设置为1;这意味着至少有1个词条应该匹配。如果想要查询匹配所有词条的文档,可以把minimum_match属性设置为2 2. 使用bool查询来合并多个term插叙。可以通过布尔查询来封装...
五、Elasticsearch使用terms搜索多个值
SQL:ES:会返回三条,["java", "hadoop"],["java"],["java", "elasticsearch"]3、若仅仅想搜索只包含java的帖子怎么办?(就是说不想要["java", "hadoop"],["java", "elasticsearch"])可以新增字段,比如新增tag_cnt代表个数 SQL:ES:只会返回tag为["java"]的这一条结果 4、梳理学...
ES的几种查询
ES(Elasticsearch)提供了多种查询方法来检索和筛选数据,包括:1. **查询字符串搜索**:以HTTP请求查询字符串的形式进行,如GET /ecommerce/product/_search,用于快速临时搜索,如搜索名称包含"yagao"且按价格降序。生产环境中使用较少,适用于简单查询。2. **查询构建语言(DSL)**:使用JSON格式在...
Elasticsearch查询语句语法
\ / 。比如:要搜索 (1+1)=2 ,则使用语句 \(1\+1\)\=2 。 不过, < 和 > 是无法转义的,它们总是会创建一个范围查询。ES文档: https://www.elastic.co/guide/en/elasticsearch/reference/current/query-dsl-query-string-query.html#_ranges 星期六, 26. 八月 2017 05:58下午 ...
elasticsearch之七search搜索详解
请求参数是请求体传递的。在Elasticsearch中,请求体的字符集默认为UTF-8。query string 后边的参数原来越多,搜索条件越来越复杂,不能满足需求。DSL:Domain Specified Language,特定领域的语言 es特有的搜索语言,可在请求体中携带搜索条件,功能强大。查询全部 GET /book/_search 排序 GET /book/_...
Elasticsearch查询及聚合类DSL语句宝典
1. Matchmatch查询精确匹配,数字、日期、布尔值或未分词的字符串直接匹配,全文本则进行分词搜索。例如,keyword类型的"京东总部"需要完全一致的词匹配,而"宝马多少马力"则会根据"宝马 多少 马力"的分词结果进行搜索。2. Match Phrase对于需要精确匹配完整短语的场景,使用match_phrase,如搜寻"宝马 多少...
如何通过elasticsearch数组元素来搜索
"); } Console.WriteLine(sb.ToString());}最好写明要查询的字段,这里面是tags,注意ES会自动把T小写;查数组和查单个元素字段没啥区别。Query的话QueryString加双引号和MatchPhrase都可以,差异不大。取的时候我一般是从results.Hits里面取,Documents我没试过;注意查数组的时候Source里面的Tags...
ElasticSearch查询之——Search API
多词匹配之间使用空格进行隔开,词语之间的关系为 “或”若想使用词语匹配,需要用双引号括起来 泛查询在之前其实就有演示过,即像 q = xiaoming 这种不指定检索字段范围,会在所有字段中进行检索的查询即称为泛查询。反之,如果指定了字段,就能大大缩小范围。常见的指定字段的方式为 字段:检索条件字符 ...