【问题标题】:Mongo/Morphia - need exactly one text index for $text query'Mongo/Morphia - $文本查询需要一个文本索引
【发布时间】:2015-09-07 15:38:16
【问题描述】:

我正在尝试使用 Mongo + Morphia 在一个类上创建和使用全文搜索。

我是这样注释的:

@Entity
@Indexes(@Index(fields = @Field(value = "$**", type = IndexType.TEXT)))
public class Product implements Comparable<Product>{

    @Id
    @Expose public ObjectId id;

    @Expose public String name;
    @Expose public String key;
    @Expose public String category;
    @Expose public String brand;
    @Expose public String description;

    @Expose public String department;
    @Expose public String price;
    @Expose public String sex; 
    @Expose public String companyKey;
    @Expose public String url;

...

我正在尝试用这个查询集合:

Datastore ds = Dao.instance().getDatabase();
return ds.createQuery(Product.class).search("mens pants").order("companyKey").asList();

但我不断收到此错误:

Query failed with error code 17007 and error message 'Unable to execute query: error processing query: 

planner returned error: need exactly one text index for $text query'

我感觉没有创建索引。有什么理由会这样吗?

我最近升级了我的 Mongo 和 Morphia 版本,之前我在一些字段上使用了旧标准索引的组合。这会导致一些“冲突”或阻止在相同字段上创建新索引吗?

编辑

根据@evanchooly 的建议,查询方法现在如下所示:

public List<Product> textSearch() {

        Datastore ds = Dao.instance().getDatabase();
        ds.ensureIndexes();
        return ds.createQuery(Product.class).search("mens pants").order("companyKey").asList();
    }

【问题讨论】:

    标签: mongodb indexing full-text-search morphia


    【解决方案1】:

    您需要运行datastore.ensureIndexes() 才能在数据库中实际创建索引。

    【讨论】:

    • 感谢某些原因,它不起作用。我想我首先需要删除现有的索引,需要设置shell。早上会试试。感谢您的帮助!
    • 如果现有索引已经存在,其名称会根据键等自动生成。它不会尝试创建新索引。您可以尝试将此索引显式命名为唯一的或删除具有该索引名称的任何现有索引。 (这个名字是如何生成默认名字的,我现在不明白。)
    • 另外,如果你没有在你的类所在的包或类本身上显式调用morphia.map(),当你调用ensureIndexes() 时,morphia 不会知道你的类。因此,请确保在尝试生成索引之前映射您的类。
    • 我无法通过 Morphia 让它工作 - 我认为这可能类似于您提到的与索引命名冲突的内容。所以我只是通过控制台删除并重新制作了索引。感谢您的帮助和解释。
    【解决方案2】:

    @evanchooly 在 cmets 中所说的是正确的。

    问题似乎是我之前创建了索引,需要先删除它们。

    所以我通过 MongoDB 命令行使用:

    db.Product.dropIndexes()
    

    在我更改 Morphia 中的索引注释方式(以及索引的创建方式)之前执行此操作意味着我得到了我想要的索引。

    因为我没有安装 Mongo CLI,所以试图避免这种情况,但事后看来,这是完全合理的。

    【讨论】:

      猜你喜欢
      • 2019-08-16
      • 1970-01-01
      • 2020-09-07
      • 2020-05-12
      • 2014-12-05
      • 2017-10-17
      • 2018-05-18
      • 2018-08-02
      • 1970-01-01
      相关资源
      最近更新 更多