В Elastic Search отсутствуют некоторые документы при создании индекса из другого индекса - PullRequest
0 голосов
/ 28 июня 2018

Я создал один индекс в имени эластичного поиска как documents_local и загружаю данные из базы данных Oracle через logstash. Этот индекс содержит следующие значения.

"FilePath" : "Path of the file",
"FileName" : "filename.pdf",
"Language" : "Language_name"    

Затем я также хочу проиндексировать содержимое этих файлов, поэтому я создал еще один индекс в упругом поиске с именем document_attachment и, используя следующий код Java, извлек FilePath & FileName из индекса documents_local с помощью filepath извлеченного файла i будет доступен на моем локальном диске, и я проиндексировал содержимое этого файла с помощью обработчика подключаемых модулей ingest-attachment.

Пожалуйста, найдите мой код Java ниже, где я индексирую файлы.

private final static String INDEX = "documents_local";  //Documents Table with file Path - Source Index
private final static String ATTACHMENT = "document_attachment"; // Documents with Attachment...  -- Destination Index
private final static String TYPE = "doc";


public static void main(String args[]) throws IOException {


    RestHighLevelClient restHighLevelClient = null;
    Document doc=new Document();

    try {
        restHighLevelClient = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http"),
                new HttpHost("localhost", 9201, "http")));
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }


    //Fetching Id, FilePath & FileName from Document Index. 
    SearchRequest searchRequest = new SearchRequest(INDEX); 
    searchRequest.types(TYPE);
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
    QueryBuilder qb = QueryBuilders.matchAllQuery();
    searchSourceBuilder.query(qb);
    searchSourceBuilder.size(3000);
    searchRequest.source(searchSourceBuilder);
    SearchResponse searchResponse = null;
    try {
         searchResponse = restHighLevelClient.search(searchRequest);
    } catch (IOException e) {
        e.getLocalizedMessage();
    }

    SearchHit[] searchHits = searchResponse.getHits().getHits();
    long totalHits=searchResponse.getHits().totalHits;

    int line=1;
    String docpath = null;

    Map<String, Object> jsonMap ;
    for (SearchHit hit : searchHits) {

        String encodedfile = null;
        File file=null;

        Map<String, Object> sourceAsMap = hit.getSourceAsMap();
        doc.setId((int) sourceAsMap.get("id"));
        doc.setLanguage(sourceAsMap.get("language"));
        doc.setFilename(sourceAsMap.get("filename").toString());
        doc.setPath(sourceAsMap.get("path").toString());

        String filepath=doc.getPath().concat(doc.getFilename());

        System.out.println("Line Number--> "+line+++"ID---> "+doc.getId()+"File Path --->"+filepath);

        file = new File(filepath);
        if(file.exists() && !file.isDirectory()) {
            try {
                FileInputStream fileInputStreamReader = new FileInputStream(file);
                byte[] bytes = new byte[(int) file.length()];
                fileInputStreamReader.read(bytes);
                encodedfile = new String(Base64.getEncoder().encodeToString(bytes));
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }

        jsonMap = new HashMap<>();
        jsonMap.put("id", doc.getId());
        jsonMap.put("language", doc.getLanguage());
        jsonMap.put("filename", doc.getFilename());
        jsonMap.put("path", doc.getPath());
        jsonMap.put("fileContent", encodedfile);

        String id=Long.toString(doc.getId());

        IndexRequest request = new IndexRequest(ATTACHMENT, "doc", id )
                .source(jsonMap)
                .setPipeline(ATTACHMENT);


        try {
            IndexResponse response = restHighLevelClient.index(request);
        } catch(ElasticsearchException e) {
            if (e.status() == RestStatus.CONFLICT) {
            }
            e.printStackTrace();
        }

    }

    System.out.println("Indexing done...");
}

Пожалуйста, найдите мои подробности сопоставления для ingest attachment plugin (сначала я сделал сопоставление, а затем выполнил этот код Java).

    PUT _ingest/pipeline/document_attachment
    {
      "description" : "Extract attachment information",
      "processors" : [
        {
          "attachment" : {
            "field" : "fileContent"
          }
        }
      ]
    }

Но, делая этот процесс, я пропускаю некоторые из документов,

Мой исходный индекс documents_local, в котором 2910 документов. Я извлекаю все 118 документы и прикрепляю свой PDF (после преобразования в base64) и записываю в другой индекс document_attachment

Но document_attachment индекс, имеющий только 118, должен быть 2910. некоторые из пропавших без вести. Кроме того, для индексации требуется очень много времени.

Не уверен, как документы отсутствуют во втором указателе (document_attachment) и есть ли другой способ импровизировать в этом процессе?

Можем ли мы включить нить здесь? Потому что в будущем я должен индексировать более 100 тыс. PDF таким же образом.

...