【发布时间】:2018-03-16 19:22:15
【问题描述】:
我有一个基于多个字段的全文索引,目前所有字段的默认权重均为 1。 现在我想从全文索引中搜索特定字段。因此,我正在考虑为不同的字段赋予不同的权重,并以某种方式将分数映射到字段,以便我可以根据分数进行过滤,从而从多个字段中过滤出特定的字段。但是看看分数计算是如何完成的 (https://github.com/mongodb/mongo/blob/master/src/mongo/db/fts/fts_spec.cpp),正确地获得分数和字段的映射似乎不是那么简单,或者可能是不可能的。
db.collection.createIndex({
Name: "text",
Line: "text",
City: "text",
State: "text",
Zip: "text",
}, {
weights: {
Name: 16,
Line:8,
City: 4,
State: 2,
Zip: 1,
},
name: "TextIndex"
})
有没有人做过类似的事情,可以指点一下吗?
【问题讨论】:
-
权重会影响所有搜索。如果您需要索引中的所有字段,并且希望将搜索限制在特定查询中的特定字段,最好使用文本搜索 + 正则表达式进行聚合。
-
@AlexBlex 我已经有一个正则表达式,但速度很慢。于是想优化。不确定权重是什么意思会影响所有搜索。由于每个字段的权重不同,因此每个字段匹配对分数的贡献也不同,对吧?所以我正在寻找一个解决方案,以确定哪些字段对分数有贡献。
-
这与 现在我想从全文索引中搜索特定字段。 我明白了,因为您需要限制搜索,例如到
Name和Line,这样如果匹配的单词仅在City字段中,则不应返回该文档。它是否准确地描述了需求?如果是这样,重量将无济于事。它们影响该领域的重要性,即希望您按相关性排序的文档顺序。 -
@AlexBlex 是的,你没看错:我的要求。如果我必须只搜索单个字段(名称),我相当确定我可以让它工作。但我一直在寻找一种可能性,如果我能以某种方式获得通用解决方案。
-
我想知道怎么做?您是否忘记在问题中提及使之成为可能的内容?通常情况下,分数介于 0 和权重之间。如果分数介于 weight 和 2*weight 之间,您的方法会起作用,但事实并非如此。对于在很长的
Name中找到的单词,即使该字段的权重为 16,基数为 0 时,其权重总是