首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >是否有可能将span_near查询排序为比重复结果更高的唯一结果?

是否有可能将span_near查询排序为比重复结果更高的唯一结果?
EN

Stack Overflow用户
提问于 2013-12-06 13:47:28
回答 1查看 161关注 0票数 0

假设我有两个包含以下信息的"catField“文档:

第一份文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
happy cat
sad cat
meh cat

第二份文件:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
happy cat
happy cat
happy cat

我试图编写一个满足两个要求的查询:

  1. 在单词"cat“后面找到长度至少为3的单词。
  2. 该查询还应将具有更独特类型的猫(文档一)的文档排序高于具有相同类型的猫(文档二)的文档。

下面是我的初始解决方案,它使用span_near和regexp来满足第一个需求:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"span_near": {
   "clauses": [
       {
            "span_multi": { 
                "match": { 
                    "regexp": {
                        "catField": "[a-z]{3,}"
                    }
                }
            }
        },
        {
            "span_multi": { 
                "match": { 
                    "regexp": {
                        "catField": "cat"
                    }
                }
            }
        }
   ],
   "slop": 0,
   "in_order": true
}

这对于查找带有猫列表的文档非常有用,但它将对文档一进行排序,而文档二(上图)则是相同的。我如何才能满足第二个要求,排名唯一的猫名单高于非唯一的?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-07 09:09:19

因此,这里有一种方法,使用一些索引魔术,以获得您想要的。我不完全确定您的需求(因为您可能处理的数据比“愉快的猫”更复杂),但是它应该让您从索引时间的方向开始。

这可能是正确的方法,也可能不是您的设置。根据索引大小和查询负载,短语查询/span查询/bool组合可能工作得更好。但是,您的需求是很棘手的,因为它们取决于顺序、前面令牌的大小和变化的数量。

这样做的优点是,您的许多复杂逻辑都被放入索引中,从而在查询时获得了速度。然而,它确实会使您的数据变得更加僵化。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl -XDELETE localhost:9200/cats
curl -XPUT localhost:9200/cats -d '
{
    "settings" : {
        "number_of_shards" : 1,
        "number_of_replicas" : 0,
        "index" : {
            "analysis" : {
                "analyzer" : {
                    "catalyzer" : {
                        "type" : "custom",
                        "tokenizer" : "keyword",
                        "filter" : ["cat_pattern", "unique", "cat_replace"]
                    }   
                },
                "filter" : {
                    "cat_pattern" : {
                     "type" : "pattern_capture",
                       "preserve_original" : false,
                       "patterns" : [
                          "([a-z]{3,} cat)"
                       ]   
                    },
                    "cat_replace" : {
                     "type" : "pattern_replace",
                       "preserve_original" : false,
                       "pattern" : "([a-z]{3,} cat)",
                       "replacement" : "cat"
                    }
                }
            }
        }
    },
    "mappings" : {
        "cats" : {
            "properties" : {
                "catField" : { 
                    "type" : "multi_field",
                    "fields": {
                        "catField" : {
                            "type": "string",
                            "analyzer": "standard"
                        },
                        "catalyzed" : {
                            "type": "string",
                            "index_analyzer": "catalyzer",
                            "search_analyzer" : "whitespace"
                        }
                    }
                }
            }
        }
    }
}'

首先,我们正在创建一个包含大量自定义分析的索引。首先,我们使用关键字分析器进行标记(它实际上并不是标记,只是发出一个令牌)。然后,我们使用一个pattern_capture过滤器查找所有“猫”前面有一个字长于三个字符。然后,我们使用一个unique过滤器来去除重复的(例如,连续三次“快乐猫”)。最后,我们使用一个pattern_replace将我们的“快乐猫”变成了“猫”。

字段的最后标记将只是"cat",但是如果有多种类型的猫,则会出现更多的"cat“。

在搜索的时候,我们只需搜索"cat“,经常提到"cat”的文档就会被推高。由于我们的分析,更多的提及意味着更多独特的类型,因此我们得到了“免费”的助推行为。

我使用了一个多字段,所以您仍然可以查询原始字段(例如,如果您想搜索“愉快的猫”)。

使用上述映射进行演示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
curl -XPOST localhost:9200/cats/cats/1 -d '
{
    "catField" : ["sad cat", "happy cat", "meh cat"]
}'

curl -XPOST localhost:9200/cats/cats/2 -d '
{
    "catField" : ["happy cat", "happy cat", "happy cat"]
}'

curl -XPOST localhost:9200/cats/cats/3 -d '
{
    "catField" : ["a cat", "x cat", "y cat"]
}'

curl -XPOST localhost:9200/cats/cats/_search -d '
{
    "query" : {
        "match": {
           "catField.catalyzed": "cat"
        }   
    }
}'

注意,搜索不会返回第三个文档,因为它的前面没有一个类型超过三个字符的cat。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20434161

复制
相关文章
PostgreSQL排序字段不唯一导致分页查询结果出现重复数据
pg单字段排序,排序字段中可能会出现重复,这样就会导致我们在进行分页查询时会出现一些和预期不相符的现象,如这个数据在第一页出现了,然后再第二页又出现。
翎野君
2023/09/25
6740
九、查询结果排序与分页
我们已经掌握使用 SELECT 语句结合 WHERE 查询条件获取需要的数据,但在实际应用中还会遇到例如学生按身高从高到低排序、商品按价格排序、博客文章按发布的先后顺序排序等等这类需求,那么遇到这类需求该如何解决呢?
喵叔
2021/06/25
8910
php如何判断SQL语句的查询结果是否为空?
PHP与mysql这对黄金搭档配合的相当默契,但偶尔也会遇到一些小需求不知道该怎么做,例如今天要谈到的:如何判断sql语句查询的结果集是否为空!
Yiiven
2022/12/15
3.6K0
Oracle查询优化-02给查询结果排序
translate和replace函数从每一行中去掉数字或者字符,这样就很容易的可以根据具体情况来排序。
小小工匠
2021/08/16
1.2K0
利用Boost影响Lucene查询结果的排序
以下代码在Lucene2.1下通过,主要是通过设置Document的Boost来影响文档的权重,以达到控制查询结果顺序的目的(前提是不利用Sort排序的情况下): private void btnSearch_Click(object sender, EventArgs e)         {             RAMDirectory ramDir = new RAMDirectory();             IndexWriter iw = new IndexWriter(ramD
菩提树下的杨过
2018/01/22
1.3K0
利用Boost影响Lucene查询结果的排序
以下代码在Lucene2.1下通过,主要是通过设置Document的Boost来影响文档的权重,以达到控制查询结果顺序的目的(前提是不利用Sort排序的情况下): private void btnSearch_Click(object sender, EventArgs e)         {             RAMDirectory ramDir = new RAMDirectory();             IndexWriter iw = new IndexWriter(ramD
菩提树下的杨过
2018/01/22
8840
MySQL使用distinct去掉查询结果重复的记录
使用 DISTINCT 关键字去掉重复记录具有较大的局限性。DISTINCT() 只能包含一个字段且查询结果也只返回该字段而非数据完整记录(如上例所示)。
用户7657330
2020/08/14
7.5K0
MySQL | 如何对查询结果集进行排序
数据操作语言:结果集排序 如果没有设置,查询语句不会对结果集进行排序。也就是说,如果想让结果集按照某种顺序排列,就必须使用 ORDER BY 子句。 SELECT ...... FROM ...... ORDER BY 列名 [ASC | DESC]; SELECT ename,sal FROM t_emp ORDER BY sal; SELECT empno,ename,sal,deptno FROM t_emp ORDER BY sal DESC; 排序关键字 ASC 代表升序(默认),DESC
Zkeq
2022/05/18
6.3K0
MySQL | 如何对查询结果集进行排序
LeetCode MySQL 1211. 查询结果的质量和占比
编写一组 SQL 来查找每次查询的名称(query_name)、质量(quality) 和 劣质查询百分比 (poor_query_percentage)。
Michael阿明
2021/02/19
1.1K0
DataTable排序结果的纠正
默认情况下,即便db中某一列的值是数字,查询出来的DataSet/DataTable里,Column的类型都是String型,所以当用dataTable.DefaultView.Sort ="XXX ASC"排序时,都是按字符串排序处理的,并不是我们想要的结果,下面给出了二种解决办法: using System; using System.Data; namespace DataTableSortSample { class Program { static void Ma
菩提树下的杨过
2018/01/24
1.5K0
《SQL Cookbook》 - 第二章 查询结果排序
1. 默认情况下,ORDER BY会做升序排列,因此ASC子句是可选的。可以通过DESC执行降序排列。可以再ORDER BY子句中列出不同的排序列,逗号分隔。
bisal
2021/09/06
1K0
Hibernate合并查询结果集为实体类
用过mybatis的小伙伴可能都知道,我们可以查询两个表的部分字段合并为一个实体。然而用了Hibernate这么久了,居然还不知道也有此神器。
小柒2012
2019/12/05
1.4K0
Hibernate合并查询结果集为实体类
用过mybatis的小伙伴可能都知道,我们可以查询两个表的部分字段合并为一个实体。然而用了Hibernate这么久了,居然还不知道也有此神器。 hibernate.jpg 说明 一般来说,Hibern
小柒2012
2018/04/16
2.1K0
Hibernate合并查询结果集为实体类
Mysql拼接查询结果
我们可以使用拼接来完成这个操作: 使用mysql的CONCAT函数,可以满足我们的需求。 例如:
手撕代码八百里
2020/07/28
4.7K0
Mysql拼接查询结果
查询结果行转列?
场景:数据库的结构中有三张表,学生表,课程表,成绩表。每个课程有着不同的学分,所以需要查学生的成绩中对应的课程。然后SUM求和。
乐心湖
2020/07/31
1.5K0
查询结果行转列?
MAT分析dump文件显示大小比jmap查询结果小
有朋友向我吐槽,她在一台测试机器上调试,使用jmap查看堆内存占用时,发现年轻代+老年代占用的内存,和dump下堆转储文件使用MAT分析显示的内存不一样,百思不得其解。重现现象如下:
Java架构师必看
2021/11/29
3.6K0
MAT分析dump文件显示大小比jmap查询结果小
SQL 从查询结果里查询[通俗易懂]
我想要从从表中查出每天电动车和手机各自的销售总额。这个需求还是蛮简单的,仅仅须要依据createtime和product group by即可了。以下是我写的SQL语句:
全栈程序员站长
2022/07/20
2.8K0
SQL 从查询结果里查询[通俗易懂]
点击加载更多

相似问题

是否删除查询的重复MySQL结果?

10

筛选后代父(或至少比结果更高)

26

按日期对查询结果排序,不重复

15

检查CI查询是否有结果

33

查询的重复结果

42
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文