<mark>此插件，主要社区贡献人（小奶奶花生米）</mark>

```xml
<dependency>
    <groupId>org.noear</groupId>
    <artifactId>solon-ai-repo-opensearch</artifactId>
</dependency>
```


### 1、描述

solon-ai 的主要扩展插件，提供 OpenSearchRepository 知识库。更多可参考 [《教程 / Solon AI 开发》](/article/learn-solon-ai)



### 2、构建示例

使用 OpenSearchRepository 时，需要嵌入模型做为支持，同时要添加用于查询的索引声明。


```yaml
solon.ai.embed:
  bgem3:
    apiUrl: "http://127.0.0.1:11434/api/embed" # 使用完整地址（而不是 api_base）
    provider: "ollama" # 使用 ollama 服务时，需要配置 provider
    model: "bge-m3:latest"
    
solon.ai.repo:
  opensearch:
    url: "http://localhost:9200" # 参考 client 需要的参数配置
    username: "xxx"
    password: "yyy"
```

开始构建

```java
@Configuration
public class DemoConfig {
    //构建向量模型
    @Bean
    public EmbeddingModel embeddingModel(@Inject("${solon.ai.embed.bgem3}") EmbeddingConfig config) {
        return EmbeddingModel.of(config).build();
    }
    
    @Bean
    public RestHighLevelClient client(@Inject("${solon.ai.repo.opensearch}") Props props) {
        URI url = URI.create(props.get("url"));
        String username = props.get("username");
        String password = props.get("password");
        
        // 创建客户端
        final CredentialsProvider credentialsProvider = new BasicCredentialsProvider();
        // 如果需要认证，请取消注释并设置用户名和密码
        credentialsProvider.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("admin", "xnnhsM_1234543"));

        RestClientBuilder builder = RestClient.builder(new HttpHost(host, port, scheme));
        if (credentialsProvider.getCredentials(AuthScope.ANY) != null) {
            builder.setHttpClientConfigCallback(new RestClientBuilder.HttpClientConfigCallback() {
                @Override
                public HttpAsyncClientBuilder customizeHttpClient(HttpAsyncClientBuilder httpClientBuilder) {
                    return httpClientBuilder.setDefaultCredentialsProvider(credentialsProvider);
                }
            });
        }

        return new RestHighLevelClient(builder);
    }
    
    //构建知识库
    @Bean
    public OpenSearchRepository repository(EmbeddingModel embeddingModel, RestHighLevelClient client){
        //创建元数据字段定义，用于构建索引（按需）
        List<MetadataField> metadataFields = new ArrayList<>();
        metadataFields.add(MetadataField.keyword("category"));
        metadataFields.add(MetadataField.numeric("priority"));
        metadataFields.add(MetadataField.keyword("title"));
        metadataFields.add(MetadataField.numeric("year"));
        
        return OpenSearchRepository.builder(embeddingModel, client)
                               .metadataFields(metadataFields)
                               .build();
    }
}
```

### 3、应用效果

```java
@Component
public class DemoService {
    //可使用统一的 RepositoryStorable 接口注入
    @Inject
    RepositoryStorable repository;
    
    //添加资源
    public void addDocument(List<Document> docs) {
        repository.insert(docs);
    }
    
    //查找资料
    public List<Document> findDocument(String query) {
       //参考 solon-expression 语法。例如：price > 12 AND category == 'book'
       return repository.search(query);
    }
}
```