停靠的Solr找不到请求处理程序

brvekthn  于 2023-03-12  发布在  Solr
关注(0)|答案(1)|浏览(275)

我目前正在做一个包含PostgreSQL、Redis、Medusa和Solr实现的项目。
我希望以容器化方式运行所有应用程序,以便可以轻松地将其部署到Linux服务器。
我的问题是,当我尝试从我的docker-compose.yml运行容器化的Solr示例时,它最终无法找到我创建的Request Handlers
当我访问运行在localhost:8983上的管理GUI时,我可以看到我的核心并运行/select请求处理程序。在GUI中,当我打开文件下的核心(称为product_core)时,我看到一个完全不同的目录。
看起来我无法让我的Solr示例找到我自己的solrconfig.xml文件,即使它们被复制到映像中。
当我将docker exec -it solr /bin/bash导入Solr示例时可以看到。
在Solr示例内部的目录中:/var/solr/data/product_core我可以看到GUI显示的文件,但我似乎无法让它工作来复制文件。
下面是我的docker-compose.yml文件:

version: "3.8"
services:
  backend:
    build:
      context: ./medusa_backend
      dockerfile: Dockerfile
    image: dahlfrederik/medusa_backend
    container_name: medusa_backend
    depends_on:
      - postgres
      - redis
    environment:
      DATABASE_URL: postgresql://postgres:alpha123@postgres:5432/postgres
      REDIS_URL: redis://redis:6379/
      NODE_ENV: development
      JWT_SECRET: some_jwt_secret
      COOKIE_SECRET: some_cookie_secret
      PORT: 9000
      ADMIN_CORS: http://localhost:7000,http://localhost:7001,http://192.168.98.141:7000,http://localhost:7000
      STORE_CORS: http://localhost:3000,http://192.168.98.141:8000,http://localhost:8000
      MEDUSA_DISABLE_TELEMETRY: "true"
    volumes:
      - ./medusa_backend/data:/var/lib/postgresql/data
    ports:
      - "9000:9000"
    restart: always
  postgres:
    image: postgres:10.4
    container_name: postgres
    ports:
      - "5432:5432"
    volumes:
      - ./postgres/data:/var/lib/postgresql/data
    restart: always
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=alpha123
      - POSTGRES_DB=postgres
  redis:
    image: redis
    container_name: redis
    expose:
      - 6379
    restart: always
  admin:
    build:
      context: ./medusa_admin
      dockerfile: Dockerfile
    image: dahlfrederik/medusa_admin
    container_name: medusa_admin
    depends_on:
      - backend
    environment:
      HOST: 0.0.0.0
      PORT: 7000
    ports:
      - "7000:7000"
    restart: always
  storefront:
    build:
      context: ./nextjs_frontend
      dockerfile: Dockerfile
    image: dahlfrederik/medusa_storefront
    container_name: storefront
    depends_on:
      - backend
    environment:
      PORT: 8000
    ports:
      - "8000:8000"
    restart: always
  solr:
    image: solr
    container_name: solr
    depends_on:
      - postgres
    ports:
      - "8983:8983"
    volumes:
      - data:/var/solr
      - ./solr:/opt/solr/server/solr/product_core
    entrypoint:
      - docker-entrypoint.sh
      - solr-precreate
      - product_core
    restart: always
volumes:
  data:

我的Solr配置文件位于Solr目录中,该目录位于包含我的docker-compose文件的文件夹中。
我创建了一个managed-schema.xml,如下所示

<?xml version="1.0" encoding="UTF-8" ?>
<schema name="default-config" version="1.6">
  <field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
  <field name="title" type="text_general" indexed="true" stored="true" />
  <field name="description" type="text_general" indexed="true" stored="true" />
  <field name="type" type="string" indexed="true" stored="true" />
  <field name="size" type="string" indexed="true" stored="true" />
  <field name="price" type="string" indexed="true" stored="true" />
  <field name="image" type="string" indexed="false" stored="true" />
  <field name="inStock" type="boolean" indexed="false" stored="true" />
  
  <uniqueKey>id</uniqueKey>
  
  <fieldType name="string" class="solr.StrField" />
  
  <fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
    <analyzer type="index">
      <tokenizer class="solr.StandardTokenizerFactory"/>
      <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
      <filter class="solr.LowerCaseFilterFactory"/>
      <filter class="solr.ASCIIFoldingFilterFactory"/>
    </analyzer>
    <analyzer type="query">
      <tokenizer class="solr.StandardTokenizerFactory"/>
      <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
      <filter class="solr.LowerCaseFilterFactory"/>
      <filter class="solr.ASCIIFoldingFilterFactory"/>
    </analyzer>
  </fieldType>
  
  <fieldType name="boolean" class="solr.BoolField" />
  
</schema>

我已经创建了一个solrconfig.xml,如下所示:

<?xml version="1.0" encoding="UTF-8" ?>
<config>
  <requestHandler name="/search" class="solr.SearchHandler">
    <lst name="defaults">
      <str name="echoParams">explicit</str>
      <int name="rows">100</int>
      <str name="fl">id,title,description,type,size,price,image,inStock</str>
      <str name="facet">true</str>
      <str name="facet.mincount">1</str>
      <str name="facet.field">size</str>
      <str name="facet.field">price</str>
      <str name="facet.field">color</str>
    </lst>
    <lst name="invariants">
      <str name="defType">edismax</str>
      <str name="qf">title^2 description</str>
    </lst>
    <arr name="last-components">
      <str>facet</str>
    </arr>
  </requestHandler>
  <requestHandler name="/autocomplete_search" class="solr.SearchHandler">
    <lst name="defaults">
      <str name="echoParams">all</str>
      <str name="df">text</str>
      <int name="rows">10</int>
      <str name="fl">title,image</str>
    </lst>
  </requestHandler>
  <searchComponent name="facet">
    <lst name="facet">
      <bool name="facet.sort">true</bool>
      <lst name="facet.field">
        <str name="field">size</str>
        <bool name="facet.missing">true</bool>
        <bool name="facet.sort">false</bool>
        <int name="facet.limit">-1</int>
      </lst>
      <lst name="facet.range">
        <str name="field">price</str>
        <int name="mincount">1</int>
        <str name="method">dv</str>
      </lst>
      <lst name="facet.field">
        <str name="field">color</str>
      </lst>
    </lst>
  </searchComponent>
  <requestHandler name="/select" class="solr.SearchHandler">
    <lst name="defaults">
      <str name="echoParams">explicit</str>
      <int name="rows">10</int>
      <str name="fl">id,title,description,type,size,price</str>
      <str name="facet">true</str>
      <str name="facet.mincount">1</str>
      <str name="facet.field">size</str>
      <str name="facet.field">price</str>
      <str name="facet.field">color</str>
      
    </lst>
    <arr name="last-components">
      <str>facet</str>
    </arr>
  </requestHandler>
  <updateRequestProcessorChain name="uuid">
    <processor class="solr.UUIDUpdateProcessorFactory">
      <str name="fieldName">id</str>
    </processor>
    <processor class="solr.LogUpdateProcessorFactory"/>
    <processor class="solr.RunUpdateProcessorFactory"/>
  </updateRequestProcessorChain>
</config>

所以看起来我不知何故把我的文件复制到了错误的目标--但是当我试图把它复制到我在Solr GUI内部可以看到的目标时,它没有找到我的核心。
提前感谢您的任何建议。
我尝试过更改配置文件的存储目录。我尝试过docker-compose up --build -d。尝试过在docker-compose.yml文件中更改为使用入口点而不是命令

h9a6wy2h

h9a6wy2h1#

原来,我的问题是配置文件保存在我的docker示例中的错误位置-我通过添加一个虚拟文本文件HelloWorld.txt,然后使用Linux搜索命令查找该文件及其位置来解决这个问题。
我通过向Azure构建/部署管道添加一个脚本来解决问题,该脚本将solr-conf文件夹的内容复制到我的docker示例,然后运行reload core命令。
因此,我的解决方案是运行一个执行以下命令的脚本:

docker cp {path-to-my-solr-config-folder]\solr\conf\. solr:/var/solr/data/{core-name]/conf

然后执行以下post命令。

curl -X POST http://localhost:8983/solr/admin/cores?action=RELOAD&core={core-name}

它可能已经做得更直观,我仍然在考虑直接添加命令到我的docker-compose.yml文件。但现在这是一个解决我的问题的方法。

相关问题