Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使用非固定数量的关键字查询倒排索引?

如何使用非固定数量的关键字查询倒排索引?
EN

Stack Overflow用户
提问于 2014-05-27 16:20:17
回答 2查看 243关注 0票数 1

如果关键字是动态的,如何查询倒排索引列表/集合(用户可以随心所欲地输入多少)?

我在构建"WHERE“子句时非常困惑,因为关键字的数量不是固定的。

万一有人不熟悉倒排索引:index

这是索引的类模型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class Index
{
    public string word;
    public List<int> referenceIDs;

    //constructor
}

这是收藏品:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<Index> invertedIndices = new List<Index>();

谢谢。

如果可能的话,我更喜欢lambda表达式中的答案,尽管任何基于sql的语言都应该是可以的。

编辑:

  1. 我编辑字段从私人到公共,以使它更容易理解。
  2. 如果您不熟悉倒排索引,则需要阅读wiki (因为这个示例非常容易理解)。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-28 06:42:34

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        var final = invertedIndices.Where(x => words.Contains(x.word))
                                   .SelectMany(y => y.referenceIDs)
                                   .GroupBy(z => z)
                                   .Where(a => a.Count() == words.Count())
                                   .Select(b => b.Key);

下面的单元测试显示,此查询只检索预期的结果。如果将"words“列表转换为字典或自定义引用类型,则可以使用联接。实际上,您不能将字符串列表与引用类型列表连接起来。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    [TestMethod]
    public void InvertedIndiciesSearchReturnsMatchOnAllKeywords()
    {
        var words = new List<string>() { "Cow", "Horse" };
        var invertedIndices = new List<Index>()
        {
            new Index { word = "Pig", referenceIDs = new List<int>() { 1, 2, 8 }},
            new Index { word = "Chicken", referenceIDs = new List<int>() { 4, 8 }},
            new Index { word = "Horse", referenceIDs = new List<int>() { 1, 2, 8 }},
            new Index { word = "Goat", referenceIDs = new List<int>() { 3 }},
            new Index { word = "Cow", referenceIDs = new List<int>() { 1, 3 }},
            new Index { word = "Coward", referenceIDs = new List<int>() { 999 }}
        };

        // Contains is searching for x.word _in the list_ "words", not searching
        // to see if any of the _strings within words_ contains x.word.

        var final = invertedIndices.Where(x => words.Contains(x.word))
                                   .SelectMany(y => y.referenceIDs)
            // now limit the results by getting only those reference IDs
            // that appeared for every item in the input list
                                   .GroupBy(z => z)
                                   .Where(a => a.Count() == words.Count())
                                   .Select(b => b.Key);


        Assert.AreEqual(1, final.Count(), "result count");
        Assert.AreEqual(1, final.First(), "value '1' is shared by Cow and Horse and should be the only result");
    }
票数 1
EN

Stack Overflow用户

发布于 2014-05-27 19:31:47

这样做的一种方法是设计你自己的收藏。Dictionary<string, List<int>>可以很好地作为底层集合使用。这使你的查找相当快。下面是这样一个类的部分实现,它展示了这样一个查找的样子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class InvertedIndexCollection : IDictionary<string, List<int>>
{
    public class IndexedWord
    {
        public string Key
        {
            get
            {
                return kvp.Key;
            }
        }
        public List<int> Value
        {
            get
            {
                return kvp.Value;
            }
        }
        private KeyValuePair<string, List<int>> kvp = new KeyValuePair<string, List<int>>();

        public IndexedWord()
        {

        }
        public IndexedWord(string _key, List<int> _newvalue)
        {
            kvp = new KeyValuePair<string, List<int>>(_key, _newvalue.OrderBy(x => x).ToList());
        }
    }
    private Dictionary<string, List<int>> Collection = new Dictionary<string, List<int>>();
    public int Count
    {
        get
        {
            return Collection.Count;
        }
    }
    public InvertedIndexCollection()
    {

    }
    public InvertedIndexCollection(Dictionary<string, List<int>> NewCollection)
    {
        Collection = NewCollection;
    }
    public List<int> this[string key]
    {
        get
        {
            return Collection[key];
        }
        set
        {
            Collection[key] = value;
        }
    }
    public void Add(IndexedWord NewItem)
    {
        if(Collection.ContainsKey(NewItem.Key))
            Collection[NewItem.Key].AddRange(NewItem.Value.Where(x => !Collection[NewItem.Key].Contains(x)));
        else
            Collection.Add(NewItem.Key, NewItem.Value);
    }
    public void Add(string Newkey, int Index)
    {
        if(Collection.ContainsKey(Newkey))
        {
            Collection[Newkey].Add(Index);
            Collection[Newkey].Sort();
        }
        else
            Collection.Add(Newkey, new List<int> { Index });
    }
    public List<int> FindIndices(string InputString, string Delimiter)
    {
        return FindIndices(InputString.Split(Delimiter.ToArray(), StringSplitOptions.RemoveEmptyEntries));
    }
    //This return a list of indices that contain all the search words.  You will
    //probably need to work out how to implement partial results, but this
    //should give you a start
    public List<int> FindIndices(IEnumerable<string> InputArray)
    {
        //Get a list of indices for each word
        var templist = (from word in InputArray
                        where Collection.ContainsKey(word)
                        select Collection[word]);
        //Flatten the lists and remove duplicates and return every index that is
        //common to all the words.
        return (from index in templist.SelectMany(x => x).Distinct()
                where templist.All(x => x.Contains(index))
                select index).ToList();
    }

    public void Add(string key, List<int> value)
    {
        Collection.Add(key, value);
    }

    public bool ContainsKey(string key)
    {
        return Collection.ContainsKey(key);
    }

    public ICollection<string> Keys
    {
        get
        {
            return Collection.Keys;
        }
    }

    public bool Remove(string key)
    {
        return Collection.Remove(key);
    }

    public bool TryGetValue(string key, out List<int> value)
    {
        return Collection.TryGetValue(key, out value);
    }

    public ICollection<List<int>> Values
    {
        get
        {
            return Collection.Values;
        }
    }
    public void Clear()
    {
        Collection.Clear();
    }

    public bool Contains(KeyValuePair<string, List<int>> item)
    {
        return Collection.Contains(item);
    }


    public IEnumerator<KeyValuePair<string, List<int>>> GetEnumerator()
    {
        return Collection.GetEnumerator();
    }

    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    {
        return Collection.GetEnumerator();
    }

    public void Add(KeyValuePair<string, List<int>> item)
    {
        throw new NotImplementedException();
    }

    public void CopyTo(KeyValuePair<string, List<int>>[] array, int arrayIndex)
    {
        throw new NotImplementedException();
    }

    public bool IsReadOnly
    {
        get
        {
            throw new NotImplementedException();
        }
    }

    public bool Remove(KeyValuePair<string, List<int>> item)
    {
        throw new NotImplementedException();
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23901007

复制
相关文章
为什么我退出了编程工作
从很小的时候就在印度出生和成长,在那里我们只有少数的职业选择。工程师和医生是很多人的头两个选择。现在,随着互联网的兴起,事情正在发生变化,但是父母期望孩子成为医生或工程师的情况并不少见。
程序那些事儿
2023/03/07
3150
为什么我退出了编程工作
setInterval()与clearInterval()的用法
setInterval() 方法可按照指定的周期来调用函数或计算表达式。  --简单地说就是过一段时间调用一次该函数 setInterval() 方法会不停地调用函数,直到 clearInterval() 被调用或窗口被关闭。由 setInterval() 返回的 ID 值可用作 clearInterval() 方法的参数。代码演示如下 var backId=setInterval("aaa()",1000); $('.aaa').mouseover(function(){ clearInter
郑小超.
2018/01/24
1.8K0
HTML DOM clearInterval() 方法
clearInterval() 方法可取消由 setInterval() 设置的 timeout。
全栈程序员站长
2022/07/07
5800
我为什么要创建一个不能被实例化的类
Python 由于多继承的原因,可能会出现钻石继承[1]又叫菱形继承。为了保留多继承的优点,但又摒除缺点,于是有了混入这种编程模式。
青南
2020/04/08
3.4K0
我为什么要创建一个不能被实例化的类
HTML DOM clearInterval() 方法
clearInterval() 方法可取消由 setInterval() 设置的 timeout。 clearInterval() 方法的参数必须是由 setInterval() 返回的 ID 值。
一个会写诗的程序员
2018/08/17
9760
OGG的PURGEOLDEXTRACTS不能工作问题的解决
PURGEOLDEXTRACTS /ogg/dirdat/horcl/hz*,USECHECKPOINTS,MINKEEPDAYS 2
星哥玩云
2022/08/17
8410
为什么我不建议你通过 Python 去找工作?
这是读者“前进一点”在微信上问我的一个问题,我当时给他的回复是“Python 挺火的,学 Python 就好。”但当我在 B 站上看了羊哥的一期视频后,深感懊悔,觉得自己给出的建议是不负责任的。
黄啊码
2022/06/20
2.8K0
为什么我不建议你通过 Python 去找工作?
这是读者“前进一点”在微信上问我的一个问题,我当时给他的回复是“Python 挺火的,学 Python 就好。”但当我在 B 站上看了羊哥的一期视频后,深感懊悔,觉得自己给出的建议是不负责任的。
沉默王二
2020/05/26
2.7K0
setTimeout实现setInterval和clearInterval[通俗易懂]
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
全栈程序员站长
2022/11/09
4930
为什么我要拒绝梦寐以求的数据科学家工作?
在深入探讨这个问题前,让我们退后一步,先试着回答另一个问题:为什么要成为数据科学家?
CDA数据分析师
2018/10/25
9350
为什么我要拒绝梦寐以求的数据科学家工作?
setInterval与clearInterval使用示例
setInterval是一个很有用的js函数,可以用来重复执行某些功能,利用这个我们可以实现一些很有趣的功能,比如: 不刷新页面的情况下,"实时"获取其它会员给你发来的问候,并弹出显示之类 下面给一个示例代码:(里面用了一些jquery的方法) Code <html> <head> <title>jquery 操作 Select</title> <script type="text/javascript" src="jquery-1.2.6.pack.js"></script> <script type
菩提树下的杨过
2018/01/23
1.6K0
躺着办公这么快乐,为什么我是还想回公司工作?
今天是小N在家办公的第八天 办公姿势:躺着 办公位置:床上 实现了零距离通勤 起床就已经到达工位 说起来这个办公位置, 大家晒出来的环境真是五花八门: 拿鞋盒子抬高电脑工作的 用洗衣机当办公桌的 还有在大树下园林式办公的 一边听着鸡鸣声一边工作的 还有拿着手机 全村跑着找wifi信号连网开视频会议的 想象中的在家办公和实际确实有所不同 除了”配置环境“以外 在家办公遇到的阻碍还有很多: 01 猫大爷 离开电脑去上个洗手间, 猫把电脑当做红毯 优雅地从上面上走过,
腾讯NEXT学位
2020/02/24
5430
躺着办公这么快乐,为什么我是还想回公司工作?
我用编程模拟疫情的传播来告诉你: 为什么现在的你还不能出门
暂时还不要流动! 还不到时候! 请告诫身边人: 不要流动! 不要流动!! 不要流动!!! 还没有到真正的时候。 本视频以数据可视化 非常直观地告诉我们疫情的传播与爆发过程 希望每个人都能点进去看
我被狗咬了
2020/02/19
2.1K0
我用编程模拟疫情的传播来告诉你: 为什么现在的你还不能出门
为什么OpenAI不能被计划?
然而,没有人说,OpenAI最初所做的这一切,注定要迎来AI的「iPhone时刻」。
新智元
2023/09/09
1660
为什么OpenAI不能被计划?
对不起,我的健康码不能给你
题图摄于广州番禺 本文记录一次关于隐私保护的事情。 近日,我去了趟某运营商的营业厅,开通一个新的手机号。入门时,扫了场所码,显示的是绿码。 营业员在帮我办理业务时,除了拍照我的身份证件外,还说要留存我的健康码和行程码。 这个要求就有点奇怪了,尽管我两个码都是正常,但作为从事隐私信息保护工作的我,对涉及自己隐私数据的事情,觉得还是要和他掰斥一下。 首先,我问他为什么需要留存我的两码?因为这两个码是用于防疫的,与办理手机业务没啥关系,他们也不是卫生防疫部门。 营业员理直气壮地说,这是他们的业务流程规定的。因为我
Henry Zhang
2023/04/04
4050
对不起,我的健康码不能给你
每次不能把工作干好的时候,就看看
软件蚕食一切。未来属于程序员。所以人人都想当程序员。但是并不是每个人都能当好程序员。在你做出决定前还是先看看自己能不能当好程序员吧。可是什么样的人不适合当程序员呢?不要喝鸡汤,我们看看 Quora 上面是如何回答的。 在全栈开发者 Adam Leffert 看来,最重要的是态度: 我认为编程要想成功最重要的是态度。当然,最低水平的智力还是要的。以我这么久的经验来看,还没见过蠢到不会做的。 但是好坏程序员之间的差别几乎永远是态度。 耐心:对我来说这是最重要的一条。写代码和调试极其令人沮丧。要想做好,你得保持冷
前朝楚水
2018/04/02
6900
我的前端工作流
在 Node.js 出现以前,以往的前端开发工作属于石器时代。而随着前端技术的大爆炸来临,我们需要赶上这一次潮流,加入到前端开发到摩登时代去。这篇博文主要是记录如何构建前端工作流。
零式的天空
2022/03/22
6310
扶我起来,前端还没倒下,我不能睡
长路漫漫,唯夜作伴。虽然一天的工作头昏脑胀,但是仍然放不下我心心念念的前端啊,扶我起来,我还可以学~
小闫同学啊
2019/12/17
8310
点击加载更多

相似问题

如何使用Uplodify和Servlet/JSP

12

在JSP和Servlet中使用对象

11

Cookie JSP和Servlet身份验证困难

10

如何使用JSP和Servlet导出CSV

10

如何使用servlet和jsp执行SPA?

45
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

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

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文