java - 如果字符串中有 '-' 例如 "3da549f0-0e88-4297-b6af-5179b74bd929",如何进行全文搜索?

标签 java arangodb arangojs

当我为字段建立索引并搜索其中包含“-”的字符串(如上面的示例)时,Arango 会将其视为否定运算符,因此不会搜索该字符串。查找这些包含“-”的文档如何解决?

最佳答案

尝试重现您所做的事情。如果您提供一个更好的可重现示例(仅使用 arangosh)您当前正在尝试的内容,我的答案可能会更准确:

http+tcp://127.0.0.1:8529@_system> db._create("testIndex")
http+tcp://127.0.0.1:8529@_system> db.testIndex.ensureIndex({type: "fulltext", fields: ["complete:3da549f0-0e88-4297-b6af-5179b74bd929"]})
{ 
  "fields" : [ 
    "complete:3da549f0-0e88-4297-b6af-5179b74bd929" 
  ], 
  "id" : "testIndex/4687162", 
  "minLength" : 2, 
  "sparse" : true, 
  "type" : "fulltext", 
  "unique" : false, 
  "isNewlyCreated" : true, 
  "code" : 201 
}

http+tcp://127.0.0.1:8529@_system> db.testIndex.save({'complete:3da549f0-0e88-4297-b6af-5179b74bd929': "find me"})
{ 
  "_id" : "testIndex/4687201", 
  "_key" : "4687201", 
  "_rev" : "4687201" 
}

http+tcp://127.0.0.1:8529@_system> db._query('FOR doc IN FULLTEXT(testIndex, "complete:3da549f0-0e88-4297-b6af-5179b74bd929", "find") RETURN doc')
[object ArangoQueryCursor, count: 1, hasMore: false]


[ 
  { 
    "_id" : "testIndex/4687201", 
    "_key" : "4687201", 
    "_rev" : "4687201", 
    "complete:3da549f0-0e88-4297-b6af-5179b74bd929" : "find me" 
  } 
]
<小时/>

所以用例看起来不同:

db.test2.save({id: 'complete:3da549f0-0e88-4297-b6af-5179b74bd929'})
db.test2.ensureIndex({type: "fulltext", fields: ["id"]})

db._query('FOR doc IN FULLTEXT(test2, "id", "3da549f0-0e88-4297-b6af-5179b74bd929") RETURN doc')

这将返回一个空结果。

要了解发生了什么,需要了解全文索引的工作原理。它将文本分割为 word boundaries并将其存储为一个列表,并引用索引中的文档。该索引全局单词列表中的一个单词可以引用多个文档。

一旦查询到索引,就会在索引全局词列表中搜索所请求的单词,找到的每个单词将包含一个包含该单词的文档列表。这些存储桶被组合起来,并作为要迭代的文档的总列表返回。

了解the tokenizer a little better, I've added a tiny js wrapper that invokes it

让我们看看它对你的字符串做了什么:

SYS_SPLIT_WORDS_ICU("ab cd", 0)
[ 
  "ab", 
  " ", 
  "cd" 
]
SYS_SPLIT_WORDS_ICU("3da549f0-0e88-4297-b6af-5179b74bd929", 0)
[ 
  "3da549f0", 
  "-", 
  "0e88", 
  "-", 
  "4297", 
  "-", 
  "b6af", 
  "-", 
  "5179b74bd929" 
]

所以你看,减号被视为单词边界,并且你的字符串被分区。您现在有几个机会来规避此问题:

  • 删除插入时的缺点
  • 分割搜索字符串,并使用哈希中最有意义的部分,后跟实际值的 FILTER 语句
  • 根本不要使用全文索引,而是使用跳跃列表或哈希索引;它们的维护成本较低,并且可用于 FILTER 语句

关于java - 如果字符串中有 '-' 例如 "3da549f0-0e88-4297-b6af-5179b74bd929",如何进行全文搜索?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36737785/

相关文章:

java - 如何在 Android Studio 中构建 AndEngine?

ArangoDb .Net 驱动性能

arangodb - 如何查询名称中包含空格的属性

java - 方法声明给出错误。是什么赋予了?

java - 启动新线程时出错

Java前后递增

ArangoDB - 如何通过数组元素的子字符串查找集合中的元素?

arangodb - 普通集合和顶点集合的区别

typescript - 在 Angular2 Web 应用程序中使用 ArangoJS 驱动程序

arangodb 终止查询不起作用需要 ("org/arangodb/aql/queries").kill ("2418")