Nano Hash - криптовалюты, майнинг, программирование

Поиск в базе данных с помощью lucene

Я использую Lucene для запроса базы данных веб-сайта, но у меня возникли некоторые проблемы. На самом деле я не знаю, связаны ли проблемы с индексированием или поиском (точнее, с построением запросов). Насколько мне известно, при поиске в нескольких таблицах базы данных SQL лучше использовать более одного документа для каждой таблицы (я следовал этим руководствам:

), которые близки к тому, чем я хочу заниматься. Фактически, в моем случае мне нужно искать в трех таблицах, которые все связаны, потому что каждая из них указывает вышеупомянутый уровень (например: продукт -> тип -> цвет). Таким образом, моя индексация была примерно такой:

        String sql = "select c.idConteudo as ID, c.designacao as DESIGNACAO, cd.texto as DESCRICAO, ctf.webTag as TAG from Conteudo c, ConteudoDetalhe cd, ConteudoTipoFormato ctf where c.idConteudo = cd.idConteudo AND cd.idConteudoTipoFormato = ctf.idConteudoTipoFormato;";
        Statement stmt = connection.createStatement();
        ResultSet rs = stmt.executeQuery(sql);

        Document document;
        while (rs.next()) 
        {          

            String S = new String();
            S += IndexerCounter;

            document = new Document();
            document.add(new Field("ID_ID",S, Field.Store.YES, Field.Index.NO));
            document.add(new Field("ID CONTEUDO", rs.getString("ID"), Field.Store.YES, Field.Index.NO));
            document.add(new Field("DESIGNACAO", rs.getString("DESIGNACAO"), Field.Store.NO, Field.Index.TOKENIZED));
            document.add(new Field("DESCRICAO", rs.getString("DESCRICAO"), Field.Store.NO, Field.Index.TOKENIZED));
            document.add(new Field("TAG", rs.getString("TAG"), Field.Store.NO, Field.Index.TOKENIZED));


            try{
                writer.addDocument(document);
            }catch(CorruptIndexException e){
            }catch(IOException e){
            }catch(Exception e){  }  //just for knowing if something is wrong

            IndexerCounter++;
        }

Если я выведу результаты, они будут примерно такими:

ID: idConteudo: designacao: texto: webTag

1:1:Xor:xor 1 Descricao:x or
2:1:Xor:xor 2 Descricao:xis Or
3:1:Xor:xor 3 Descricao:exor
4:2:And:and 1 Descricao:and
5:2:And:and 2 Descricao:&
6:2:And:and 3 Descricao:ande
7:2:And:and 4 Descricao:a n d
8:2:And:and 5 Descricao:and,
9:3:Nor:nor 1 Descricao:nor
10:3:Nor:nor 2 Descricao:not or

Что я действительно хочу, так это сделать запрос (например, Xor) и найти его в созданных документах для него. Таким образом, мой метод поиска выглядит примерно так:

Конструктор:

public Spider(String Query, String Pathh) {
        String[] Q;
        QueryFromUser = new String();
        QueryFromUser = Query;
        QueryToSearch1 = new String();
        QueryToSearch2 = new String();
        Path = Pathh;

        try {
            try {
                Class.forName("com.mysql.jdbc.Driver");
            } catch (ClassNotFoundException e) {
                e.printStackTrace();
                return;
            }
            try {
                connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "");
            } catch (SQLException e) {
                e.printStackTrace();
                return;
            }


            Q = Query.split(" ");

            //NOTE: the AND word enables the search engine to search by the various words in a query
            for (int i = 0; i < Q.length; i++) {
                if ((Q.length - i) > 1) //prevents the last one to take a AND
                {
                    QueryToSearch1 += Q[i] + " AND ";
                } else {
                    QueryToSearch1 += Q[i];
                }
            }

            for (int i = 0; i < Q.length; i++) {
                QueryToSearch2 += "+" + Q[i];
            }
            try {
                SEARCHING_CONTENT();
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(Spider.class.getName()).log(Level.SEVERE, null, ex);
            } catch (InstantiationException ex) {
                Logger.getLogger(Spider.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IllegalAccessException ex) {
                Logger.getLogger(Spider.class.getName()).log(Level.SEVERE, null, ex);
            } catch (SQLException ex) {
                Logger.getLogger(Spider.class.getName()).log(Level.SEVERE, null, ex);
            } catch (ParseException ex) {
                Logger.getLogger(Spider.class.getName()).log(Level.SEVERE, null, ex);
            }
            SEARCHING_WEB();  //not for using now
        } catch (CorruptIndexException ex) {
            Logger.getLogger(Spider.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Spider.class.getName()).log(Level.SEVERE, null, ex);
        }

Идея в том, что QueryToSearch1 и QueryToSearch2 имеют команды (я видел их в онлайн-руководстве, не совсем помню где) AND и +. Таким образом, на запрос пользователя «не или» будет выполняться поиск «не И или» для поиска двух слов одновременно и «+ не + или» для поиска двух слов по отдельности. Это одно из моих сомнений, я не знаю, действительно ли построение запросов lucene похоже на это. Дело в том, что в методе Querying:

private void SEARCHING_CONTENT() throws CorruptIndexException, IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException, ParseException {
        Querying(QueryToSearch1);  // search for the whole phrase
        Querying(QueryToSearch2);  //search by individual words
        //Querying(QueryFromUser);  //search by individual words
    }

    private void Querying(String QueryS) throws CorruptIndexException, IOException, ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException, ParseException {
        searcher = new IndexSearcher(IndexReader.open(Path + "/INDEX_CONTENTS"));
        query = new QueryParser("TAG", new StopWords()).parse(QueryS);
        query.toString();
        hits = searcher.search(query);
        pstmt = connection.prepareStatement(sql);

        for (int i = 0; i < hits.length(); i++) {
            id = hits.doc(i).get("TAG");         
            pstmt.setString(1, id);
            displayResults(pstmt);
        }
    }

нет совпадений по документам по запросу. Важно сказать, что в следующей строке:

  query = new QueryParser("TAG", new StopWords()).parse(QueryS);

StopWords - это класс, который я создал, который расширяет StandardAnalyser, но это новый класс со словами, которые я указал (для НЕ удаления важных для моих поисковых слов, таких как или или и - в этом случае эти слова могут быть важны).

Как я уже сказал, проблема в том. При поиске совпадений нет. Я не уверен, что это из-за индексации или из-за построения запросов для поиска (если запросы построены плохо, следовательно, совпадений нет).

Я был бы признателен за любую помощь от кого угодно. Я с радостью предоставлю дополнительную информацию, если потребуется.

Большое спасибо.


Ответы:


1

Легкий первый шаг для вас - используйте Люк (https://code.google.com/p/luke/), чтобы посмотреть ваш index. Вы можете запустить свои запросы от Люка, чтобы проверить, находят ли они что-то или нет.

Люка довольно легко понять, поскольку у него очень полезный пользовательский интерфейс (https://code.google.com/p/luke/source/browse/wiki/img/overview.png)

08.08.2013
  • Спасибо. Это очень полезный инструмент. : D. 09.08.2013
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..