悬赏:java mongodb 全文检索中文问题

项目中用了mongodb进行存储python爬取的相关数据。爬取的内容95%的都是中文的。现在有业务需要根据关键字从mongodb中进行全文检索。在开发过程中,发现中文检索在某些情况下检索不出来,特来论坛求猿神赐教。下面贴相关代码和图片:
mogodb相关业务某个集合里面的数据:

img

java查询代码如下:

img

集合中有5条包含“沙悟净”的数据,但是只查出来了前三条,后面两条查不出来,我翻过相关资料,都说全文检索对英文的支持是最好的,对中文支持不太好,英文的每个单词之间都是有空格或者标点符号的,而中文大部分汉字与汉字之间都是紧挨的,个别是有标点符号的。
如果我把最后两条的备注字段分别修改为:菩萨 沙悟净;佛祖 沙悟净 啊(或者是:佛祖,沙悟净。啊) 只要是关键词前后有分隔符。那么全文检索就能查询出来,如果没有分隔符则查不出来。 现在特来论坛求猿神赐教该怎么修改代码,能把后面2条查出来。

有猿神能赐教解决一下不,完美解决了 红包Ing!~

引用ChatGPT部分回答:
对于使用 MongoDB 进行中文全文检索的问题,通常需要考虑以下几个方面:

  1. 分词器:中文的一大特点就是没有空格,因此在进行全文检索时需要进行中文分词。可以使用标准分词器或中文分词器,如 ik-analyzer、hanlp 等,在存储数据时进行分词处理,以便后续进行检索。

  2. 索引:在 MongoDB 中,可以使用文本索引来进行全文检索,需要在存储数据的集合中创建文本索引,并指定分词器,以便在检索时使用相同的分词器。

  3. 检索:在进行检索时,可以使用 MongoDB 提供的文本检索操作符 $text 或 $search 进行检索,并指定分词器。例如,使用 $text 进行检索时,可以指定分词器并使用以下语法:db.collection.find({ $text: { $search: "关键字", $language: "中文分词器名" } })

  4. 其他注意事项:

    • 分词器选择:不同分词器的效果有所不同,需要根据实际情况进行选择。
    • 检索性能:全文检索对性能要求较高,尤其在数据量较大的情况下,需要进行性能测试和优化。
    • 特殊字符:中文中的标点符号和其他特殊字符可能会影响分词和检索的效果,需要进行处理。

综上所述,使用 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": "沙悟净"}})

希望以上内容能够对您有所帮助。如果您还有其他问题或疑问,欢迎继续提问。