草庐IT

mongodb - 访问/搜索术语自动完成的原始Mongodb文本索引内容(标记化术语)

coder 2023-11-01 原文

我的用户要求我提供一个“类似google”的查询术语建议(自动完成),它对拼写错误的术语和一般的洞察力很有用。Mongo文本索引只搜索完整且拼写正确的术语。
我需要访问文本索引本身,即它的“单词”。我确实读过this crude solution并且正在寻找比双索引和管理术语(word)引用计数更不脆弱的东西。
我所要做的就是得到最多n个以特定文本开头的索引标记。不要告诉我使用regex搜索,因为它会破坏更快的文本索引。
我不想使用弹性搜索、lucene或其他外部索引器:维护噩梦。文本搜索属于数据库,Mongo在这方面有一些优势。

最佳答案

因为您已经对regexp说了不,并且还说您更喜欢使用内置的mongodb文本搜索,所以我将建议您使用一种我以前实现过的方法。它可以进行部分单词搜索、多个单词搜索以及“有限范围”的拼写错误、单数/复数、现在/过去时态、动词、名词搜索。但请注意,如果每个字段都包含1000个单词,这将不高效(可能也不会返回正确的值)。
MongoDB文本搜索只匹配完整的单词,因此字符串应该相应地格式化。关键点是创建一个替代文本字段(您将在其上应用文本索引),而不是用于查找文本匹配项的当前字段。
此外,还必须从客户端输入中创建一个单词数组以匹配
我将概述我所做的一切。假设集合中的字符串是
“使用MongoDB实现自动完成功能”
您将从中创建以下文本字符串并将其存储为另一个字段(文本索引字段)
“im imp impl implement implementi implementi implementin implementing au aut auto co com comp compl comple complete fe fea feat featu featur feature mo mong mongo mongod mongodb”
文件插入前的过程如下所述
清除字符串-转换为小写,删除特殊字符,如-,()等
去掉那些无关紧要的词,如是、是、使用、中间、拥有等。
将剩余的单词推送到数组(input_array)。
对于input_数组中的每个单词,取长度为2、4、5的子串,并将其推送到output_数组。这些将匹配自动完成,并提供一些拼写错误的掩护。例如,“实现”将生成“im”、“imp”、“impl”
对于输入数组中长度为n的每个单词,取长度为n-3、n-2、n-1、n的子串,并将其推入输出数组。这样做的好处是可以弥补一些语法错误/差异。例如-用户类型“implement”,文本与“implementing”将返回正匹配。例如,“implementing”将生成“implement”、“implementi”、“implementin”、“implementing”
合并数组以创建包含多个单词的文本字符串并将其插入到集合中
现在,用户搜索输入也必须格式化为数组。这里还将遵循步骤1、2、3、4、5来创建搜索输入数组。
将步骤4应用于客户端搜索字符串的好处是,它可以为拼写错误提供“一些”保护。例如,用户键入“impdement”,格式化的数组将是('im'、'imp'、'impd'、'impde'、'impdem'、'impdeme'、'impdement')。您可以看到两个有效的匹配项可用于实现。其余的词都是不恰当的词,只会匹配很少的词条
现在,将步骤5应用于客户端搜索术语的好处是提供一些保护,以防止语法变化,如现在/过去时态、单数/复数、名词/动词等。例如,用户类型“implement”、“implementation”、“implemented”、“implements”格式的搜索数组将YS包含术语“implement”,它与集合中的条目进行有效匹配。
必须使用类似于
query[“$text”]={$search:formatted_search_input_array};
如果要显示建议标记,应在结果集中处理一点。您应该从前n个匹配项中获取“原始文本”。然后清理并拆分单词。使用terms search_数组执行直接子字符串匹配,并将匹配结果作为标记返回。但是如果你有少于10个单词的小句子,你也可以像google一样返回完整的文本(如果用户键入多个单词的查询,这会显得更好)
如果你的弦短,你会得到更好的结果。
当然,生成文本字符串的条件应该修改以满足您的需要。您还应该考虑将格式化的备用文本存储在另一个集合中,并通过objectid引用将其链接(如果它很大)。

关于mongodb - 访问/搜索术语自动完成的原始Mongodb文本索引内容(标记化术语),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43332911/

有关mongodb - 访问/搜索术语自动完成的原始Mongodb文本索引内容(标记化术语)的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  3. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  4. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  5. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

    我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

  6. ruby - 续集在添加关联时访问many_to_many连接表 - 2

    我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

  7. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  8. ruby - RuntimeError(自动加载常量 Apps 多线程时检测到循环依赖 - 2

    我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("

  9. ruby-on-rails - Nokogiri:使用 XPath 搜索 <div> - 2

    我使用Nokogiri(Rubygem)css搜索寻找某些在我的html里面。看起来Nokogiri的css搜索不喜欢正则表达式。我想切换到Nokogiri的xpath搜索,因为这似乎支持搜索字符串中的正则表达式。如何在xpath搜索中实现下面提到的(伪)css搜索?require'rubygems'require'nokogiri'value=Nokogiri::HTML.parse(ABBlaCD3"HTML_END#my_blockisgivenmy_bl="1"#my_eqcorrespondstothisregexmy_eq="\/[0-9]+\/"#FIXMEThefoll

  10. ruby - 查找字符串中的内容类型(数字、日期、时间、字符串等) - 2

    我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s

随机推荐