使用反应式 mongoDB 在 Micronaut 中创建 TextIndex

Creating TextIndex in Micronaut with reactive mongoDB

我在 Micronaut 应用程序中使用反应式 mongoDB

implementation("io.micronaut.mongodb:micronaut-mongo-reactive")

正在尝试创建 TextIndex 和搜索自由文本功能

public class Product {
    @BsonProperty("id")
    private ObjectId id;
    private String name;
    private float price;
    private String description;
}

在 spring 数据中,我们有 @TextIndexed(weight = 2) 为集合创建一个 TextIndex,Micronaut 应用程序中的等价物是什么。

恐怕 Micronaut Data 还不支持基于 MongoDB 注释的自动索引创建。 Micronaut Data 现在简化了仅使用 SQL 数据库的工作。

但是您仍然可以像这样使用 MongoClient 手动创建索引:

@Singleton
public class ProductRepository {

    private final MongoClient mongoClient;

    public ProductRepository(MongoClient mongoClient) {
        this.mongoClient = mongoClient;
    }

    public MongoCollection<Product> getCollection() {
        return mongoClient
            .getDatabase("some-database")
            .getCollection("product", Product.class);
    }

    @PostConstruct
    public void createIndex() {
        final var weights = new BasicDBObject("name", 10)
            .append("description", 5);

        getCollection()
            .createIndex(
                Indexes.compoundIndex(
                    Indexes.text("name"),
                    Indexes.text("description")
                ),
                new IndexOptions().weights(weights)
            )
            .subscribe(new DefaultSubscriber<>() {
                @Override
                public void onNext(String s) {
                    System.out.format("Index %s was created.%n", s);
                }

                @Override
                public void onError(Throwable t) {
                    t.printStackTrace();
                }

                @Override
                public void onComplete() {
                    System.out.println("Completed");
                }
            });
    }

}

您当然可以使用任何您想要的订阅者。扩展 DefaultSubscriber 的匿名 class 仅用于演示目的。

更新: 您可以在启动时创建索引,例如使用 @PostConstruct。意思是在@Singleton注解的某个仓库或class注解的服务中,在@PostConstruct注解的方法中添加所有索引创建逻辑,然后在repository/service单例创建后调用。