在.net中的mongodb中进行全文搜索

时间:2016-12-28 06:30:25

标签: c# .net mongodb mongodb-query mongodb-.net-driver

我必须在.net mvc中搜索mongodb特定集合中的所有文档中的内容。我已经通过像这里成功创建索引一样尝试了mongodb shell。

db.collection_name.createIndex( { subject: "text" } )

db.collection_name.find( { $text: { $search: "search_word" } } )

工作正常。但是,当我把它放在.net中,这给了我错误。我用Google搜索并获得了以下索引解决方案。

 collection.EnsureIndex(new IndexKeysBuilder().Ascending("subject"));

现在我如何运行此查询db.collection_name.find( { $text: { $search: "coffee" } } )

我正在尝试使用.net。

collection.CreateIndex("subject":"text");

var query = collection.Find({ $text: { $search: "coffe" }}); 

但我在第一行收到错误"将文本表示为unicode系列....语法错误"

第二行错误"没有给出符合所需形式参数的参数"和"意外的角色$"。

任何建议将不胜感激。

3 个答案:

答案 0 :(得分:6)

我可以使用此命令创建文本索引:

collection.Find(Builders<searchFileByAuthor>.Filter.Text("coffe")).ToList();

而且我可以这样查询索引:

searchFileByAuthor

public class searchFileByAuthor { public int Id { get; set; } public string subject { get; set; } } 只是我的假类,有主题字段:

import groovy.io.FileType
import groovy.sql.Sql
import oracle.jdbc.OracleDriver

import java.sql.Date

final def PROJECT_DIR = "/appdata/project/pmp"
final def SCRIPT_DIR = "/scm/src/main/scripts"

// To be able to use driver...
new OracleDriver();

sql = Sql.newInstance("jdbc:oracle:thin:@localhost:1521:XE", "PMP", "pmp")

sql.execute("delete from SCM_GROOVY_SCRIPTS")

def dir = new File(PROJECT_DIR + SCRIPT_DIR);
dir.eachFileRecurse(FileType.FILES) { file ->
    String scriptName = file.name.substring(0, file.name.indexOf('.'))
    def timestamp = new Date(System.currentTimeMillis())

    println scriptName
    println timestamp

    List<Object> params = new ArrayList<>()
    params.add(scriptName)
    params.add(file.bytes)
    params.add(timestamp)

    sql.execute("INSERT INTO SCM_GROOVY_SCRIPTS (SCRIPT_NAME, SCRIPT_SOURCE, LAST_UPDATED) VALUES (?, ?, ?)", params)
}

sql.close()

答案 1 :(得分:3)

Maksim Simkin的答案是正确的,尽管它已经过时了。 更新的版本将是:

collection.Indexes.CreateOne(new CreateIndexModel<YourClass>(Builders<YourClass>.IndexKeys.Text(x => x.something)));

或者,如果您想使用通配符索引(为整个文档建立索引),则可以这样做:

collection.Indexes.CreateOne(new CreateIndexModel<YourClass>(Builders<YourClass>.IndexKeys.Text("$**")));

或者出于某种原因,您可能想要/拥有更多索引,而不是这样做:

var indexWildcardTextSearch = new CreateIndexModel<YourClass>(Builders<YourClass>.IndexKeys.Text("$**"));

List<CreateIndexModel<YourClass>> indexes = new List<CreateIndexModel<YourClass>>();
indexes.Add(indexWildcardTextSearch);

collection.Indexes.CreateMany(indexes);

要查询,它保持不变:

collection.Find(Builders<YourClass>.Filter.Text("something")).ToList();

答案 2 :(得分:0)

public List<T> FindSearch<T>(string collectionName, string searchWord) {
    IMongoQuery query = Query.Text(searchWord);
    List<T> find = getCollection<T>(collectionName).Find(query).ToList();
    return find;
}