Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Mizaushev Adam. Advanced Search Home Assignment #17

Open
wants to merge 3 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
91 changes: 91 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
# ~~~ Custom ignorables ~~~
hh-school-search-test/
Todos.java

# ~~~ Java .gitignore template ~~~
# Compiled class file
*.class

Expand All @@ -21,3 +26,89 @@

# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*

# ~~~ Maven .gitignore template ~~~
target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
# https://github.com/takari/maven-wrapper#usage-without-binary-jar
.mvn/wrapper/maven-wrapper.jar

# ~~~ JetBrains .gitignore template ~~~
# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839

# User-specific stuff
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/**/usage.statistics.xml
.idea/**/dictionaries
.idea/**/shelf

# Generated files
.idea/**/contentModel.xml

# Sensitive or high-churn files
.idea/**/dataSources/
.idea/**/dataSources.ids
.idea/**/dataSources.local.xml
.idea/**/sqlDataSources.xml
.idea/**/dynamic.xml
.idea/**/uiDesigner.xml
.idea/**/dbnavigator.xml

# Gradle
.idea/**/gradle.xml
.idea/**/libraries

# Gradle and Maven with auto-import
# When using Gradle or Maven with auto-import, you should exclude module files,
# since they will be recreated, and may cause churn. Uncomment if using
# auto-import.
# .idea/artifacts
# .idea/compiler.xml
# .idea/jarRepositories.xml
# .idea/modules.xml
# .idea/*.iml
# .idea/modules
# *.iml
# *.ipr

# CMake
cmake-build-*/

# Mongo Explorer plugin
.idea/**/mongoSettings.xml

# File-based project format
*.iws

# IntelliJ
out/

# mpeltonen/sbt-idea plugin
.idea_modules/

# JIRA plugin
atlassian-ide-plugin.xml

# Cursive Clojure plugin
.idea/replstate.xml

# Crashlytics plugin (for Android Studio and IntelliJ)
com_crashlytics_export_strings.xml
crashlytics.properties
crashlytics-build.properties
fabric.properties

# Editor-based Rest Client
.idea/httpRequests

# Android studio 3.1+ serialized cache file
.idea/caches/build_file_checksums.ser
13 changes: 13 additions & 0 deletions .idea/compiler.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

14 changes: 14 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 6 additions & 0 deletions .idea/vcs.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

54 changes: 54 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,4 +1,58 @@
# hh-school-search

## Реализованные возможности

**Основные задания:**
1. Индексация
2. Поиск

Возможность явного указания пути к индексу была намеренно исключена ввиду сложной структуры файлов, однако имеется возможность вручную редактировать, копировать, заменять эти файлы с помощью нативных средств ОС,
а также пересоздать их с помощью специальных команд. Подробнее описано в следующих разделах.

**Дополнительные задания:**
1. Операторы AND и NOT (NOT реализован в виде бинарного оператора, исключающего из результатов левого операнда результаты правого операнда - как разность множеств).
2. Фразовые запросы (они же - c ограничением расстояния). Синтаксис: `<< term1 term2 ... >>` (двойные угловые скобки, как подобие кавычек).
В качестве результата запрос возвращает первый токен удовлетворяющей фразы в документе.
Поддерживается символ "любого слова": `<< term1 * term3 >>`. Стоп-слова в запросе не поддерживаются, но их положение учитывается в самом документе при поиске.
Пример: `<< Marina * * Diamond >>` => "Marina and the Diamond", "Marina Developer in Diamond", ...
3. Применена оптимизация по нахождению пересечения множеств (см. Также реализовано)
4. ENTRY_OR: OR с задаваемым минимальным количеством вхождений. Синтаксис: `<limit>[<term|subQuery> <term|subQuery> ...]`.
Пример из задания: `2[java scala kotlin]`.
5. *(От себя):* Вложенные подзапросы и приоритет операций (круглые скобки).
Примеры: `Developer AND (C# OR C++)`, `3[белый (серый NOT (гусь OR утка)) <<из ржаной муки>> черный] AND (хлеб OR булка)`.

**Также реализовано:**
1. Работа со стоп-словами, знаками препинания, специальными терминами (включающими в себя знаки препинания, как "C++").
2. Оптимизация: инвертированный индекс по токенам позволяет находить конкретное место в документе, удовлетворяющее запросу.
3. Оптимизация: инвертированный индекс по документам позволяет быстрее находить пересечение по документам (используется в AND, ENTRY_OR, NOT), не выполняя distinct над токенами.
4. Оптимизация: операция пересечения (AND) выполняется в порядке увеличения результатов, удовлетворяющих отдельным операндам пересечения. Результат: меньшее число проверок и операций добавления/удаления.

**Примечания:**
1. OR должен быть явно указан между операндами (сделано так с перспективой лучшего анализа и ранжирования. Например, понимание ".NET Framework" в первую очередь как целого терма).
2. Фразовый запрос не может содержать подзапросов, только термы или `*` через пробел.
3. Использование стоп-слов в запросах не запрещается, но поиск ведется по термам, из которых таковые исключены, следовательно для такого операнда не найдется удовлетворяющих токенов, о чем появляется предупреждение при попытке выполнить такой запрос.

## Сборка и запуск

1. Сборка в среде IntelliJ IDEA: `Вкладка 'Maven' > package`
2. Скопируйте файл `hh-school-search-1.0-SNAPSHOT-jar-with-dependencies.jar` в удобную директорию
3. Инициализация рабочей директории (файлы ресурсов): `java -jar hh-school-search-1.0-SNAPSHOT-jar-with-dependencies.jar init`
4. Индексация: `java -jar hh-school-search-1.0-SNAPSHOT-jar-with-dependencies.jar index <путь к файлу>`
5. Поиск: `java -jar hh-school-search-1.0-SNAPSHOT-jar-with-dependencies.jar search "<запрос>"`

* Инициализация (восстановление по умолчанию) только файлов словарей: `java -jar hh-school-search-1.0-SNAPSHOT-jar-with-dependencies.jar init dict`
* Инициализация (восстановление по умолчанию) только файлов индекса: `java -jar hh-school-search-1.0-SNAPSHOT-jar-with-dependencies.jar init index`

## Настройка ресурсов

Пакет jar создает и использует файлы словарей и индекса в папке `./res`.
Вы можете изменить их в любом удобном текстовом редакторе.

В папке репозитория [`src/main/resources`](src/main/resources) расположены файлы, содержащие словарь знаков пунктуации, специальных терминов, стоп-слов и т.п., встраиваемые в пакет jar и генерируемые по умолчанию командой `init`.

Вы можете использовать комментарии в этих файлах.
Начало комментария = (начало строки или пробел, решетка, не решетка); конец комментария = конец строки (regex: `/(^|\s)#[^#].*$/`).

## Дз по поиску

Реализовать свой простой поиск на java, который может работать в 2 режимах:
Expand Down
2 changes: 2 additions & 0 deletions hh-school-search.iml
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4" />
75 changes: 75 additions & 0 deletions pom.xml
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>org.example</groupId>
<artifactId>hh-school-search</artifactId>
<version>1.0-SNAPSHOT</version>

<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.6</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
</dependencies>

<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<configuration>
<archive>
<manifest>
<addClasspath>true</addClasspath>
<mainClass>HHSchoolSearch.Main</mainClass>
</manifest>
</archive>
</configuration>
</plugin>

<plugin>
<!-- NOTE: We don't need a groupId specification because the group is
org.apache.maven.plugins ...which is assumed by default.
-->
<artifactId>maven-assembly-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<mainClass>HHSchoolSearch.Main</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id> <!-- this is used for inheritance merges -->
<phase>package</phase> <!-- bind to the packaging phase -->
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

</project>
Loading