我想在Mongo DB中的特定字段启用文本搜索.我想在python( - > pymongo)中实现这个搜索.当我按照互联网上的说明操作时:
db.foo.ensure_index(('field_i_want_to_index', 'text'), name="search_index")
Run Code Online (Sandbox Code Playgroud)
我收到以下错误消息:
Traceback (most recent call last):
File "CVE_search.py", line 8, in <module>
db.foo.ensure_index(('field_i_want_to_index', 'text'), name="search_index")
File "/usr/local/lib/python2.7/dist-packages/pymongo/collection.py", line 1599, in ensure_index
return self.create_index(key_or_list, cache_for, **kwargs)
File "/usr/local/lib/python2.7/dist-packages/pymongo/collection.py", line 1466, in create_index
index_doc = helpers._index_document(keys)
File "/usr/local/lib/python2.7/dist-packages/pymongo/helpers.py", line 100, in _index_document
for (key, value) in index_list:
ValueError: too many values to unpack
Run Code Online (Sandbox Code Playgroud)
在pymongo中创建索引有不同/更好的方法吗?
我正在尝试使用Postgres中的相似度函数来进行模糊文本匹配,但每当我尝试使用它时,我都会收到错误:
function similarity(character varying, unknown) does not exist
Run Code Online (Sandbox Code Playgroud)
如果我向文本添加显式强制转换,我会收到错误:
function similarity(text, text) does not exist
Run Code Online (Sandbox Code Playgroud)
我的查询是:
SELECT (similarity("table"."field"::text, %s::text)) AS "similarity", "table".* FROM "table" WHERE similarity > .5 ORDER BY "similarity" DESC LIMIT 10
Run Code Online (Sandbox Code Playgroud)
我是否需要做一些事情才能将pg_trgm初始化?
我找到了很多关于模糊匹配的链接,将一个字符串与另一个字符串进
我有一个非常长的字符串,它是一个文档和一个子字符串.子字符串来自原始文档,但已被多次转换,因此可能引入了奇怪的工件,例如此处的空格,字符串.子字符串将匹配原始文档中文本的一部分99%或更多.我不匹配以查看此字符串是哪个文档,我试图在文档中找到字符串开始的索引.
如果字符串是相同的,因为没有引入随机错误,我会使用document.index(substring),但是如果甚至有一个字符差异,则会失败.
我认为通过删除除字符串和子字符串中的az之外的所有字符来比较差异,然后使用压缩字符串时生成的索引将压缩字符串中的索引转换为真实文档中的索引.这种情况很好用,其中差异是空格和标点符号,但只要一个字母不同就失败了.
该文档通常是几页到一百页,而子串从几个句子到几页.
我在我的项目中使用模糊匹配主要是为了找到相同名称的拼写错误和拼写错误.我需要准确理解弹性搜索的模糊匹配如何工作以及它如何使用标题中提到的2个参数.
据我所知,min_similarity是查询字符串与数据库中字符串匹配的百分比.我找不到如何计算此值的确切描述.
据我所知,max_expansions是应该执行搜索的Levenshtein距离.如果这实际上是Levenshtein距离,它将是我理想的解决方案.无论如何,它不起作用,例如我有"Samvel"这个词
queryStr max_expansions matches?
samvel 0 Should not be 0. error (but levenshtein distance can be 0!)
samvel 1 Yes
samvvel 1 Yes
samvvell 1 Yes (but it shouldn't have)
samvelll 1 Yes (but it shouldn't have)
saamvelll 1 No (but for some weird reason it matches with Samvelian)
saamvelll anything bigger than 1 No
Run Code Online (Sandbox Code Playgroud)
文档说的是我实际上不理解的东西:
Add max_expansions to the fuzzy query allowing to control the maximum number
of terms to match. Default to …Run Code Online (Sandbox Code Playgroud) 我有代表用户的文件.他们有田地name和surname.
假设我有两个用户索引 - 迈克尔杰克逊和迈克尔斯塔尔.我想要这些示例搜索工作:
我尝试了不同的查询,并通过cross_fields类型的multi_match查询获得了最佳结果.但有两个问题:
换句话说,我想实现类似Facebook的人搜索.
我对ElasticSearch很新,所以也许我错过了一些明显的东西.抱歉,如果我这样做.
描述
我有两个数据集,其中包含我需要合并的信息.我唯一常见的字段是不完全匹配的字符串和可能大不相同的数字字段
解释问题的唯一方法是向您显示数据.这是a.csv和b.csv.我想把B合并到A.
B中有三个字段,A中有四个字段.公司名称(仅文件A),基金名称,资产类别和资产.到目前为止,我的重点是尝试通过替换字符串的单词或部分来匹配基金名称以创建完全匹配,然后使用:
a <- read.table(file = "http://bertelsen.ca/R/a.csv",header=TRUE, sep=",", na.strings=F, strip.white=T, blank.lines.skip=F, stringsAsFactors=T)
b <- read.table(file = "http://bertelsen.ca/R/b.csv",header=TRUE, sep=",", na.strings=F, strip.white=T, blank.lines.skip=F, stringsAsFactors=T)
merge(a,b, by="Fund.Name")
Run Code Online (Sandbox Code Playgroud)
但是,这只会让我达到约30%的匹配率.其余的我必须手工完成.
资产是一个数值领域,在这两个领域并不总是正确的,如果基金资产较少,资产可能会有很大差异.Asset Class是一个字符串字段,在两个文件中"通常"相同,但是存在差异.
在文件B中增加了不同系列的资金.例如:
AGF加拿大价值
AGF加拿大价值-D
在这些情况下,我必须选择未经过服务的那个,或者选择名为"A"," - A"或"Advisor"的那个作为匹配.
题
你会说最好的方法是什么?这个练习是我每月必须做的事情,手动匹配它是非常耗时的.代码示例将是有用的.
IDEAS
我认为可行的一种方法是根据字符串中每个单词的第一个大写字母规范化字符串.但是我还没弄清楚如何使用R来解决这个问题.
我考虑的另一种方法是根据资产,基金名称,资产类别和公司的组合创建匹配指数.但同样,我不知道如何用R做到这一点.或者,就此而言,如果它甚至可能.
非常感谢代码,评论,想法和方向的例子!
我正在研究一些内部CRM的东西.该公司目前的前端允许大量重复.我试图阻止最终用户加入同一个人,因为他们搜索的是"比尔约翰逊",而不是"威廉约翰逊".因此,用户将提供有关其新客户的一些信息,我们将找到相似的名称(包括模糊名称),并将它们与我们数据库中已有的内容进行匹配,并询问它们是否意味着那些东西......是这样的数据库还是技术存在吗?
我只是冒险进入看似简单但非常复杂的搜索世界.对于应用程序,我需要构建一个搜索机制,以按名称搜索用户.
阅读了大量的帖子和文章,包括:
如何使用Lucene进行个人姓名(名字,姓氏)搜索?
http://dublincore.org/documents/1998/02/03/name-representation/
通过优先考虑用户关系来搜索社交网络的最佳方式是什么?
http://www.gossamer-threads.com/lists/lucene/java-user/120417
Lucene索引和查询设计问题 - 搜索人员
Lucene模糊搜索客户名称和部分地址
......以及其他一些我现在无法找到的人.在我的机器上进行至少索引和基本搜索工作我已经为用户搜索设计了以下方案:
1)具有第一,第二和第三名称字段并使用Solr对其进行索引
2)使用edismax作为多列搜索的requestParser
3)使用标准化过滤器的组合,例如:音译,拉丁语到ascii convesrion等
.4 )最后使用模糊搜索
很明显,对于这方面的新手,我不确定上述是否是最好的方法,并希望听到在这个领域比我更有想法的有经验的用户.
我需要能够通过以下方式匹配名称:
1)口音折叠:Jorn匹配Jörn,反之亦然
2)替代拼写:Karl匹配Carl,反之亦然
3)缩短陈述(我相信我使用SynonymFilterFactory):Sue匹配Susanne等
.4)Levenstein匹配:Jonn匹配John等
.5)Soundex匹配:Elin和Ellen
任何指导,批评或评论都是非常受欢迎的.如果可能的话请告诉我......或者我只是白日做梦.:)
编辑
我还必须补充一点,我也有一个全名字段,以防有些人有长名字,作为其中一个帖子的例子:Jon Paul或Del Carmen也应该匹配Jon Paul Del Carmen
由于这是一个新项目,我可以以任何我认为合适的方式修改架构和架构,因此限制非常有限.
我正在我的网络应用程序中实现搜索建议功能,并一直在查看现有的技术实现.
似乎大多数主要站点(亚马逊,Bing等)都以下列方式实现模糊搜索:
Tokenize search string in to terms
processingSearchStringSet = {}
For each term
if exact term is NOT in index
Get possible terms (fuzzyTerms) from levenshtein(term, 1 (or 2))
For each term in fuzzyTerms
if term is in index
processingSearchStringSet.intersect(stringsIndexedByTermsSet)
else
processingSearchStringSet.intersect(stringsIndexedByTermsSet)
Run Code Online (Sandbox Code Playgroud)
然后,结果集成员可能按度量(例如,术语顺序保留,绝对术语位置,搜索流行度)进行排序,并且在被传递回用户之前基于该排名和预定结果集大小来保留或消除.
另一方面,谷歌的实施与此有很大不同.
具体来说,它允许搜索字符串的组成条款中出现1个以上的错误.错误阈值似乎取决于字符串中感兴趣的术语的位置,尽管它永远不会超过7.
有趣的是:
N-gram也看不到正在使用:修改一个术语,使其不包含原始术语中存在的二元组,似乎不会影响结果.
这是一个说明我的发现的例子:
Example term: "Fiftyyyy shades of grey"
Amazon suggestions: none
(if the error count exceeds 1 on any term, the search fails)
Bing suggestions: none
(if the error count exceeds …Run Code Online (Sandbox Code Playgroud) language-agnostic algorithm search fuzzy-search autocomplete
我是那个地区的新手,我很想知道最先进的是什么以及我可以在哪里阅读它.
让我们假设我只有一个键/值存储,并且我以某种方式定义了一些距离(key1,key2)(不确定它是否必须是度量,即三角不等式是否必须始终保持).
我想要的主要是一个搜索(键)功能,它返回所有带有键的项目,直到搜索键一定距离.也许距离限制是可配置的.也许这也只是一个懒惰的迭代器.也许还有一个计数限制,一个项目(键,值)在返回集合中有一些概率P,其中P = 1 /距离(键,搜索键)左右(即,完美匹配肯定会是在集合和近似匹配中至少具有高概率).
一个示例应用是MusicBrainz中的指纹匹配.他们使用AcoustId指纹并定义了这个比较功能.他们使用PostgreSQL GIN索引,我猜(虽然我还没有完全理解/读取acoustid服务器代码)GIN部分匹配算法,但我还没有完全理解这是我要求的以及它是如何工作的.
对于文本,到目前为止我发现的是使用一些语音算法来根据发音简化单词.一个例子是在这里.这主要是为了将搜索空间缩小到更小的空间.然而,这有一些限制,例如它在较小的空间中仍然必须是完美的匹配.
但无论如何,我也在寻找更通用的解决方案,如果存在的话.
fuzzy-search ×10
search ×3
indexing ×2
algorithm ×1
asp.net ×1
autocomplete ×1
c# ×1
database ×1
edismax ×1
fuzzy-logic ×1
javascript ×1
lucene ×1
mongodb ×1
postgresql ×1
pymongo ×1
r ×1
ruby ×1
solr ×1
sql ×1
sql-server ×1
string ×1
text-search ×1