项目中用了mongodb进行存储python爬取的相关数据。爬取的内容95%的都是中文的。现在有业务需要根据关键字从mongodb中进行全文检索。在开发过程中,发现中文检索在某些情况下检索不出来,特来论坛求猿神赐教。下面贴相关代码和图片:
mogodb相关业务某个集合里面的数据:
java查询代码如下:
集合中有5条包含“沙悟净”的数据,但是只查出来了前三条,后面两条查不出来,我翻过相关资料,都说全文检索对英文的支持是最好的,对中文支持不太好,英文的每个单词之间都是有空格或者标点符号的,而中文大部分汉字与汉字之间都是紧挨的,个别是有标点符号的。
如果我把最后两条的备注字段分别修改为:菩萨 沙悟净;佛祖 沙悟净 啊(或者是:佛祖,沙悟净。啊) 只要是关键词前后有分隔符。那么全文检索就能查询出来,如果没有分隔符则查不出来。 现在特来论坛求猿神赐教该怎么修改代码,能把后面2条查出来。
有猿神能赐教解决一下不,完美解决了 红包Ing!~
引用ChatGPT部分回答:
对于使用 MongoDB 进行中文全文检索的问题,通常需要考虑以下几个方面:
分词器:中文的一大特点就是没有空格,因此在进行全文检索时需要进行中文分词。可以使用标准分词器或中文分词器,如 ik-analyzer、hanlp 等,在存储数据时进行分词处理,以便后续进行检索。
索引:在 MongoDB 中,可以使用文本索引来进行全文检索,需要在存储数据的集合中创建文本索引,并指定分词器,以便在检索时使用相同的分词器。
检索:在进行检索时,可以使用 MongoDB 提供的文本检索操作符 $text 或 $search 进行检索,并指定分词器。例如,使用 $text 进行检索时,可以指定分词器并使用以下语法:db.collection.find({ $text: { $search: "关键字", $language: "中文分词器名" } })
。
其他注意事项:
综上所述,使用 MongoDB 进行中文全文检索需要进行分词器的选择、索引的创建以及检索语句的制定等操作,同时还需要注意检索性能和特殊字符等问题。
以下答案由GPT-3.5大模型与博主波罗歌共同编写:
问题出在中文分词上,需要使用中文分词工具将中文文本进行分词,然后再进行全文检索。可以使用ik-analyzer来完成中文分词,具体步骤如下:
1.下载ik-analyzer插件,将ik-analyzer-xx.jar放入项目lib中。
2.修改Java查询代码,使用IK分词器进行分词,代码如下:
/**
* 全文检索
* @param field 要检索的字段名
* @param text 要检索的文本
* @return 返回查询结果
* @throws Exception
*/
public List<Document> textQuery(String field, String text) throws Exception {
List<Document> results = new ArrayList<>();
//1.获取集合
MongoCollection<Document> collection = mongodbConnect.getCollection(databaseName, collectionName);
//2.创建查询条件
Bson filter = Filters.text(text);
//3.创建分词器
Analyzer analyzer = new IKAnalyzer();
//4.创建全文检索查询器
QueryBuilder queryBuilder = new QueryBuilder();
queryBuilder.text(analyzer, text, null);
//5.执行查询
FindIterable<Document> findIterable = collection.find(filter).projection(Projections.metaTextScore("score")).sort(Sorts.metaTextScore("score")).limit(maxRows);
for (Document doc : findIterable) {
results.add(doc);
}
//6.返回结果
return results;
}
3.在mongodb控制台创建text索引:
db.collection.createIndex({ key_name: "text" }, { default_language: "chinese" })
其中key_name为要创建全文检索的字段名。然后就可以使用以上代码进行全文检索了。
红包已经送出,希望这个解决方案对您有帮助。
如果我的回答解决了您的问题,请采纳!
引用chatGPT作答,针对中文全文检索的问题,你可以尝试以下解决方案:
1.使用分词器对中文文本进行分词,然后对分词后的结果建立索引,这样就能实现中文全文检索。目前比较流行的中文分词器有:jieba、ansj、hanlp等。
2.对于已经存储在mongodb中的数据,可以考虑使用中文分词器将文本进行分词,然后将分词结果存储到新的字段中,再对新的字段建立索引,以实现中文全文检索。
3.如果您不想使用中文分词器,也可以考虑在进行全文检索时,将关键字进行分词,并使用分词结果进行检索。这种方法虽然效率较低,但可以实现简单的中文全文检索。
以下是一个使用中文分词器(jieba)对mongodb中的数据进行分词,并对分词结果建立索引的示例代码:
import pymongo
import jieba
# 连接mongodb数据库
client = pymongo.MongoClient("mongodb://localhost:27017/")
db = client["mydatabase"]
collection = db["mycollection"]
# 遍历集合中的所有文档
for doc in collection.find():
# 对备注字段进行分词
words = jieba.lcut(doc["备注"])
# 将分词结果存储到新的字段中
doc["分词结果"] = words
# 更新文档
collection.update_one({"_id": doc["_id"]}, {"$set": doc})
# 对新的字段建立索引
collection.create_index([("分词结果", pymongo.TEXT)], default_language='chinese')
在建立索引后,您可以使用以下代码对新字段进行全文检索:
# 在分词结果字段中查找包含关键字的文档
result = collection.find({"$text": {"$search": "沙悟净"}})
希望以上内容能够对您有所帮助。如果您还有其他问题或疑问,欢迎继续提问。