- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
假设我想开发一个 android 应用程序,允许用户搜索离您所在位置最近的酒店。这在当今的应用程序中非常普遍,例如 AirBnb。
这是我正在使用的数据集:
{
"name" : "The Most Amazing Hotel",
"city" : "India",
"type": "Point"
"coord": [
-56.16082,
61.15392
]
}
{
"name" : "The Most Incredible Hotel",
"city" : "India",
"type": "Point"
"coord": [
-56.56285,
61.34590
]
}
{
"name" : "The Fantastic GuestHouse",
"city" : "India",
"type": "Point"
"coord": [
-56.47085,
61.11357
]
}
name
字段,以便它按名称搜索,然后根据坐标按地理空间索引排序。
A compound text index cannot include any other special index types, such as multi-key or geospatial index fields.
name
索引文本。字段而不是
city
和
name
领域。
最佳答案
有一个合理的例子,你真的根本不需要这个,因为很难证明这样一个操作的用例是合理的,我认为“搜索酒店”不是“文本”的组合”和“geoSpatial”搜索确实适用。
实际上,“大多数人”会寻找靠近某个地点的东西,或者更有可能靠近他们想要访问的各个地点,作为他们的主要标准的一部分,然后其他“赢家”可能会更重视“成本” ”、“评级”、“品牌”、“设施”,甚至可能靠近餐馆等。
向该列表添加“文本搜索”是一件非常不同的事情,在这个特定的应用程序中可能没有太多实际用途。
尽管如此,这可能值得一些解释,这里有几个概念需要理解,为什么这两个概念至少在这个用例中没有真正“啮合”。
修复架构
首先,我想提出一个建议来“调整”你的数据模式:
{
"name" : "The Most Amazing Hotel",
"city" : "India",
"location": {
"type": "Point",
"coordinates": [
72.867804,
19.076033
]
}
}
"location"
作为用于索引的有效 GeoJSON 对象,您通常需要 GeoJSON 而不是传统的坐标对,因为它确实为查询和存储提供了更多选项,而且距离被标准化为米,而不是等价的“弧度”。地球。
db.hotels.createIndex({ "name": "text", "location": "2dsphere" })
{ "ok" : 0, "errmsg" : "bad index key pattern { name: \"text\", location: \"2dsphere\" }: Can't use more than one index plugin for a single index.", "code" : 67 }
db.hotels.createIndex({ "name": "text" })
db.hotels.createIndex({ "location": "2dsphere" })
db.hotels.find({
"location": {
"$nearSphere": {
"$geometry": {
"type": "Point",
"coordinates": [
72.867804,
19.076033
]
}
}
},
"$text": { "$search": "Amazing" }
})
Error: command failed: { "waitedMS" : NumberLong(0), "ok" : 0, "errmsg" : "text and geoNear not allowed in same query", "code" : 2 } : undefined
$or
条件,你基本上回到点 1,即使应用“索引交叉”,也有这种“特殊”索引的另一个属性,它们 必须应用于查询操作的“顶级”以允许索引选择。将这些包装在 $or
中意味着 MongoDB 不能这样做,因此是不允许的。 db.hotels.aggregate([
{ "$geoNear": {
"near": {
"type": "Point",
"coordinates": [
72.867804,
19.076033
]
},
"spherical": true,
"maxDistance": 5000,
"distanceField": "distance",
"query": {
"name": /Amazing/
}
}}
])
db.hotels.find({
"location": {
"$nearSphere": {
"$geometry": {
"type": "Point",
"coordinates": [
72.867804,
19.076033
]
},
"$maxDistance": 5000
}
},
"name": /Amazing/
})
db.hotels.find({
"$text": { "$search": "Amazing" },
"location": {
"$geoWithin": {
"$centerSphere": [[
72.867804,
19.076033
], 5000 ]
}
}
})
.explain()
仔细查看每种方法中的选择选项。看看发生了什么,但基本情况是每个都只选择一个特殊的索引来分别使用。
name
给出的正则表达式参数进行过滤。 field 。
$geoWithin
的地理空间过滤器(不使用索引) ,在这种情况下,它执行的操作基本上等同于
$near
正在做,通过在
circle around a point 中搜索在提供的距离内过滤结果。
100 results
,并且通过最佳匹配,这 100 个很可能不包含所有“附近”项目。
$text
运算符实际上并没有真正以任何方式对结果进行“排序”。它的主要目的实际上不仅是“匹配”一个短语,而且是
"score"结果是为了将“最佳”匹配 float 到顶部。这通常是在查询本身“之后”完成的,预计值被“排序”并且很可能是“有限”的,如上所述。在聚合管道中可能会这样做,然后应用第二个过滤器,但如上所述,这可能会排除在其他目的中“接近”的事物。
"Amazing"
作为此处的示例短语而不是
"Most"
正如问题中所建议的那样。这是因为“词干”在此处(以及大多数专用文本搜索产品)中的文本索引中是如何工作的,因为特定术语将是
忽略 ,就像“and”、“or”、“the”,甚至“in”一样,因为它们对于短语并不真正有值(value),而这正是文本搜索所做的。
关于mongodb - 在 Mongodb 上使用带有地理空间索引的全文搜索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33765288/
这几天我一直在努力。我一直在自学 CSS,所以对菜鸟好一点。我正在创建一个推荐 slider 。推荐以 3 个 block 显示。我希望前 2 个下降,第 3 个上升。但是当 slider 激活时,无
我最近开始学习 Nodejs,现在我很困惑我的网络应用程序使用什么,html 还是 ejs (Express)。 Ejs 使用 Express 模块,而 .html 使用 HTML 模块。我的第一个问
假设我们有一个 PostgreSQL 表contacts,每条记录都有一堆带标签的电子邮件地址(标签和电子邮件对)——其中一个是“主要”。 存储方式如下: id 主键 电子邮件 文本 email_la
我成功为一种新的tesseract语言编写了traineddata文件,但是当我完成时,我继续收到以下错误: index >= 0 && index = 0 && 索引 < size_used_ :E
这个问题已经有答案了: How to deal with SettingWithCopyWarning in Pandas (21 个回答) 已关闭 4 年前。 假设我有一个像这样的数据框,第一列“密
如果我有一个位置或行/列同时用于 A 和 B 位置,请检查 B 是否与 A 成对角线? 1 2 3 4 5 6 7 8 9 例如,我如何检查 5 是否与 7 成对角线? 此外,如果我检查 4 是
MongoDB:索引 一、 创建索引 默认情况下,集合中的_id字段就是索引,我们可以通过getIndexes()方法来查看一个集合中的索引 > db.user.getIndexes() [ { "v
一、索引介绍 索引是一种用来快速查询数据的数据结构。 B+Tree就是一种常用的数据库索引数据结构,MongoDB采用B+Tree 做索引,索引创建在colletions上。 MongoDB不使用索引
我无法决定索引。 就像我有下面的查询需要太多时间来执行: select count(rn.NODE_ID) as Count, rnl.[ISO_COUNTRY_CODE] as Cou
我有这些表: CREATE TABLE `cstat` ( `id_cstat` bigint(20) NOT NULL, `lang_code` varchar(3) NOT NULL,
我正在尝试找到一种方法来提高包含 IP 范围的 mysql 表的性能(在高峰时段每秒最多有 500 个 SELECT 查询(!),所以我有点担心)。 我有一个这种结构的表: id smallint(
jquery index() 似乎无法识别元素之一,总是说“无法读取未定义的属性‘长度’”这是我的代码。mnumber 是导致问题的原因。我需要 number 和 mnumber 才能跟踪使用鼠标,并
我们有一个包含近 4000 万条记录的 MongoDB 集合。该集合的当前大小为 5GB。此集合中存储的数据包含以下字段: _id: "MongoDB id" userid: "user id" (i
文档说:如果你有多个字段的复合索引,你可以用它来查询字段的开始子集。所以如果你有一个索引一个,乙,丙你可以用它查询一种一个,乙a,b,c 我的问题是,如果我有一个像这样的复合索引一个,乙,丙我可以查询
我正在使用 $('#list option').each(function(){ //do stuff }); 循环列表中的选项。我想知道如何获取当前循环的索引? 因为我不想让 var i = 0;循
MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。 打个比方,如果合理的设计且使用索引的MySQL是一辆兰博基尼的话,那么没有设计和使用索引的MySQL
SQLite 索引(Index) 索引(Index)是一种特殊的查找表,数据库搜索引擎用来加快数据检索。简单地说,索引是一个指向表中数据的指针。一个数据库中的索引与一本书后边的索引是非常相似的。
我是 RavenDB 的新手。我正在尝试使用多 map 索引功能,但我不确定这是否是解决我的问题的最佳方法。所以我有三个文件:Unit、Car、People。 汽车文件看起来像这样: { Id: "
我有以下数据,我想根据范围在另一个表中建立索引 我想要实现的是,例如,如果三星的销售额为 2500,则折扣为 2%,低于 3000 且高于 1000 我知道它可以通过索引来完成,与多个数组匹配,然后指
我正在检查并删除 SQL 数据库中的重复和冗余索引。 所以如果我有两个相同的索引,我会删除。 例如,如果我删除了重叠的索引... 索引1:品牌、型号 指标二:品牌、型号、价格 我删除索引 1。 相同顺
我是一名优秀的程序员,十分优秀!