Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Поиск с ключевыми символами 
:(
    Опции темы
DenWPF
Дата 17.5.2011, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



Я делаю поиск по музыке, музыка у меня приходит с двумя данными, название песни и исполнитель.

Есть у меня класс, он сортирует запрос.
 Вот сейчас он работает так  
; - разделитель запросов
 # -  название песни
 ^ - Поиск в пределах определенного группы\артиста 
+\- песня только с ними \  песня только без них.

т.е

Запрос   "пляж #пляж" - должен вывести ТОЛЬКО песни которые назваются со словом "пляж" и  группа\исполнитель не называется "пляж"

Вот хочется сделать более идельно. что бы работа +\- в # ^ и добавление  [ ]  - то  что находиться между ними считается одним словом.

т.е чтто бы работало "пляж +#пляж -^пляж [крутой отдых]" это обозначает. Искать только где в названии "пляж" группа не называется "пляж" и что бы была точная фраза крутой отдых. и к примеру если + перед # ^ отсутвует то считается что там стоит +.

p.s забыл сказать, это надо всё сложить в массив _minus - все отрицательные  и.т.д

а все слова без ключевых знаков шли в _str т.е "пляж -#группа крутой" записывалось в _str "пляж крутой"


p.s завтра сдавать курсач. если поможете спасибо.
  
Код

public class SearchTag {

    static final String TAGSPLIT = ";";
    static final char TAGSTRIC = '"'; //Поиск по словосочетанию
    static final String TAGARTIST = " ^";//Поиск в пределах определенного группы\артиста 
    static final String TAGMUSIC = " #";//Поиск в пределах определенного название песни
    static final String TAGMINUS = " -";//Поисковые слова, которые нужно исключить (-)
    static final String TAGPLUS = " +";//Поиск точного соответствия (+)
    static final String TAGSTART = "[";
    static final String TAGEND = "]";
    String[] _minus;
    String[] _artist;
    String[] _plus;
    String[] _title;
    SearchTag[] _searchTag;
    String _str = "";

    public SearchTag(String str) {
        
        String[] ses = str.split(TAGSPLIT);
        _searchTag = new SearchTag[ses.length];
        if (ses.length > 1) {
            for (int i = 0; i < ses.length; i++) {
                _searchTag[i] = new SearchTag(ses[i]);
            }
        } else {
            _searchTag[0] = this;
            _str = ses[0];
            _minus = GetArray(TAGMINUS);
            _plus = GetArray(TAGPLUS);
            _artist = GetArray(TAGARTIST);
            _title = GetArray(TAGMUSIC);
        }

        
    }
}

PM MAIL   Вверх
Stolzen
Дата 17.5.2011, 14:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Нужно данные из строки запроса распределить по подходящим массивам? 


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
Stolzen
Дата 17.5.2011, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Попробуйте использовать регулярные выражения:

Код

        String query = "пляж1 +#пляж2 -^пляж3 [крутой отдых] #диез ^шапочка отдых";
        
        String plainWords = "(?<=(^| ))[0-9A-Za-zА-Яа-яЁё]+(?=( |$))";
        String bracketsExp = "\\[([0-9A-Za-zА-Яа-яЁё]+ ?)+\\]";
        String minusWords = "-.+?[0-9A-Za-zА-Яа-яЁё]+";
        String plusWords = "[+].+?[0-9A-Za-zА-Яа-яЁё]+";
        
        String diezWords = "(?<=(^| ))#.+?[0-9A-Za-zА-Яа-яЁё]+";
        String capWords = "(?<=(^| ))\\^.+?[0-9A-Za-zА-Яа-яЁё]+";
        
        
        String[] patterns = {
                plainWords, 
                bracketsExp,
                minusWords,
                plusWords,
                diezWords,
                capWords,
        };
        
        
        for (String pStr : patterns) {
            System.out.println(pStr + ":");
            Pattern p = Pattern.compile(pStr);
            Matcher m = p.matcher(query);
            
            while (m.find()) {
                System.out.println(m.group());
            }
            
            System.out.println();
        }




Код

(?<=(^| ))[0-9A-Za-zА-Яа-яЁё]+(?=( |$)):
пляж1
отдых

\[([0-9A-Za-zА-Яа-яЁё]+ ?)+\]:
[крутой отдых]

-.+?[0-9A-Za-zА-Яа-яЁё]+:
-^пляж3

[+].+?[0-9A-Za-zА-Яа-яЁё]+:
+#пляж2

(?<=(^| ))#.+?[0-9A-Za-zА-Яа-яЁё]+:
#диез

(?<=(^| ))\^.+?[0-9A-Za-zА-Яа-яЁё]+:
^шапочка


Это сообщение отредактировал(а) Stolzen - 17.5.2011, 15:14


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
DenWPF
Дата 17.5.2011, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



это конечно хорошо, но опять же нету времени разбираться в этом, будет много глюков.
к примеру вот сейчас вел ответ не очень адекватный.

Цитата

запрос -#минусАртист -^минусНазвание #артист [просто много текст]

Цитата


(?<=(^| ))[0-9A-Za-zА-Яа-яЁё]+(?=( |$)):
запрос
много

\[([0-9A-Za-zА-Яа-яЁё]+ ?)+\]:
[просто много текст]

-.+?[0-9A-Za-zА-Яа-яЁё]+:
-#минусАртист
-^минусНазвание

[+].+?[0-9A-Za-zА-Яа-яЁё]+:

(?<=(^| ))#.+?[0-9A-Za-zА-Яа-яЁё]+:
#артист

(?<=(^| ))\^.+?[0-9A-Za-zА-Яа-яЁё]+:



p.s Хотя выбора то нет.

я добавил новые массивы для сортировки.

Цитата

пляж ^пляж #море -^пляжМИНУС -#мореМИНУС  +#мореПЛЮС  +^пляжПЛЮС 


_minus  // глобальный минус
_plus = // глобальный плюс
_artistMinus // минус в артисте -#мореМИНУС
_artistPlus // плюс в артисте #море, #мореПЛЮС
_titleMinus // минус в названии -^пляжМИНУС
_titlePlus // плюс в названии ^пляж, +^пляжПЛЮС 



Это сообщение отредактировал(а) DenWPF - 17.5.2011, 15:51
PM MAIL   Вверх
DenWPF
Дата 17.5.2011, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



ПОМОГИТЕ

Код

        String plainWords = "(?<=(^| ))[0-9A-Za-zА-Яа-яЁё]+(?=( |$))";
        String bracketsExp = "\\[([0-9A-Za-zА-Яа-яЁё]+ ?)+\\]";//???
        String minusWords = "-[0-9A-Za-zА-Яа-яЁё]+";
        String minusTitle = "-^[0-9A-Za-zА-Яа-яЁё]+";
        String minusArtist = "-#[0-9A-Za-zА-Яа-яЁё]+";
        
        String plusWords = "[+][0-9A-Za-zА-Яа-яЁё]+";
        String plusTitle = "[+]^[0-9A-Za-zА-Яа-яЁё]+";
        String plusArtist = "[+]#[0-9A-Za-zА-Яа-яЁё]+";


из строки "пляж ^пляж #море -^пляжМИНУС -#мореМИНУС  +#мореПЛЮС  +^пляжПЛЮС "

остались не обработанные  "^пляж #море -^пляжМИНУС    +^пляжПЛЮС  " помогите ))
PM MAIL   Вверх
Stolzen
Дата 17.5.2011, 16:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1041
Регистрация: 17.10.2005

Репутация: 23
Всего: 48



Цитата(DenWPF @  17.5.2011,  17:00 Найти цитируемый пост)
String plusTitle = "[+]^[0-9A-Za-zА-Яа-яЁё]+";

Тут ^ экзанировать нужно - //^ вот так записать, т.к. просто шапочка обозначает начало строки



Цитата(DenWPF @  17.5.2011,  17:00 Найти цитируемый пост)
String bracketsExp = "\\[([0-9A-Za-zА-Яа-яЁё]+ ?)+\\]";//???

Вот этот вообще лучше бы так переписать:

Код

bracketsExp = "(\\[.+?\\])";



А вообще, вот вариант проще:

Код

        String query = "пляж1 +#пляж2 -^пляж3 [крутой много текст отдых] #диез [текст опять] ^шапочка отдых [и еще раз текст]";
        
        String exp = "([-+^#]*[0-9A-Za-zА-Яа-яЁё]+ ?)|(\\[.+?\\])";
        
        Pattern p = Pattern.compile(exp);
        Matcher m = p.matcher(query);
         
        ArrayList<String> tokens = new ArrayList<String>();
        
        while (m.find()) {
            tokens.add(m.group().trim());
        }
        
        System.out.println(tokens);


Код

[пляж1, +#пляж2, -^пляж3, [крутой много текст отдых], #диез, [текст опять], ^шапочка, отдых, [и еще раз текст]]


Разбить весь запрос на токены, а затем уже каждый рассматривать. Можно, например, каждый из них проверять на соответсвие регэкспу. Или сделать проще - если первый символ такой-то и следующий за ним такой-то, то делать одно, если другой - то другое.

Это сообщение отредактировал(а) Stolzen - 17.5.2011, 16:31


--------------------
datatalks.ru - анализ данных, статистика, машинное обучение
PM MAIL WWW   Вверх
DenWPF
Дата 17.5.2011, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1659
Регистрация: 26.9.2009

Репутация: нет
Всего: 1



Спасибо, сделал по первому примеру, пока решил [] убрать есть много других забот.


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0482 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.