【发布时间】:2015-12-14 14:09:29
【问题描述】:
我在 Cloudant 中有许多文档,它们的 ID 字段类型为字符串。 ID 可以是一个简单的字符串,例如“aaa”、“bbb”或存储为文本的数字,例如“111”、“222”等。我需要能够使用上面的字段进行全文搜索,但是我遇到了一些问题。
假设我有两个文档,ID="aaa" 和 ID="111",然后使用查询进行搜索:
- ID:aaa
- ID:“aaa”
- ID:[aaa TO zzz]
- ID:["aaa" 到 "zzz"]
按预期返回第一个文档
- ID:111
什么都不返回,但是
- ID:“111”
返回第二个文档,所以至少有办法检索它。
不幸的是,在搜索范围时:
- ID:[111 到 999]
- ID:[“111”到“999”]
我没有得到任何结果,而且我不知道如何解决这个问题。这种情况有什么特殊的语法吗?
更新:
索引函数:
function(doc){
if(!doc.ID) return;
index("ID", doc.ID, { index:'not_analyzed_no_norms', store:true });
}
将索引更改为 analyzed 没有帮助。 Analyzer 本身是 keyword,但更改为 standard 也无济于事。
更新 2
只是为了添加更多上下文,因为我认为我错过了一个关键点。我正在索引的字段将使用范围进行搜索,并且最小值和最大值都可以由用户提供。因此,其中一个可能是存储为字符串的数字,而另一个是标准的非数字文本。例如搜索 ID >= "11" 和 ID
假设数据库包含 ID 为“1”、“5”、“alpha”、“beta”、“gamma”的文档,此查询应返回“5”、“alpha”、“beta”。请注意实际上应该返回“5”,因为字符串“5”大于字符串“11”。
【问题讨论】:
-
你有机会分享你的地图功能吗?
-
没有地图功能,因为这是全文索引。问题现已更新,并包含索引函数体。
-
@ArekDygas 你能评论一下为什么你想对字符串进行这种范围查询吗?在我看来,如果排序和查询范围很重要,那么您将使用数值。
-
@Raj 如果不提供系统的详细描述,很难解释全部目的。简而言之,我必须查询的字段由用户填写,可以在其中输入任何内容,无论是 ABCDEF、32342、)(*^@% 还是任何其他值。然后另一个用户可能会发出命令来搜索这个字段,提供单个值(用于完全匹配)或两个值(用于范围)。如果我无法解决此问题,那么我将不得不考虑对用户输入的值进行预处理,但我如果可能的话,我希望避免这种情况,因为这可能会被证明是不平凡的。
-
@ArekDygas 也许您的用例更像是邻近搜索而不是范围搜索?范围意味着找到“介于两者之间”的东西,听起来这个概念在这里并不适用。而文本邻近度是此类搜索的最佳选择。