├── .idea
├── vcs.xml
├── modules.xml
├── everywhere.iml
└── workspace.xml
├── parser
├── text.rs
├── pdf.rs
└── mod.rs
├── README.md
├── main.rs
├── app.rs
├── Cargo.toml
├── search
├── indexer.rs
└── engine.rs
├── main_window.rs
└── CHANGELOG.md
/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/parser/text.rs:
--------------------------------------------------------------------------------
1 | use std::path::Path;
2 | use anyhow::Result;
3 | use tokio::fs;
4 |
5 | pub async fn extract_text(path: &Path) -> Result {
6 | let content = fs::read_to_string(path).await?;
7 | Ok(content)
8 | }
--------------------------------------------------------------------------------
/.idea/modules.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.idea/everywhere.iml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/parser/pdf.rs:
--------------------------------------------------------------------------------
1 | use std::path::Path;
2 | use anyhow::Result;
3 | use tokio::task;
4 |
5 | pub async fn extract_text(path: &Path) -> Result {
6 | let path = path.to_owned();
7 | task::spawn_blocking(move || {
8 | let bytes = std::fs::read(&path)?;
9 | let content = pdf_extract::extract_text_from_mem(&bytes)?;
10 | Ok(content)
11 | }).await?
12 | }
--------------------------------------------------------------------------------
/parser/mod.rs:
--------------------------------------------------------------------------------
1 | pub mod pdf;
2 | pub mod docx;
3 | pub mod text;
4 |
5 | use std::path::Path;
6 | use anyhow::Result;
7 |
8 | pub async fn parse_pdf(path: &Path) -> Result {
9 | pdf::extract_text(path).await
10 | }
11 |
12 | pub async fn parse_docx(path: &Path) -> Result {
13 | docx::extract_text(path).await
14 | }
15 |
16 | pub async fn parse_text(path: &Path) -> Result {
17 | text::extract_text(path).await
18 | }
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # everywhere :mag:
2 |
3 | The name is inspired by everything, an awesome tool to search files in your PC. But the limitation is it can only search for filename. Recently, I am developing a tool to scan the documents in PC to search for some specific kind of data. A idea hits me that if I can develop a tool where I can search the content of files. It is the creation of this tool.
4 |
5 | ready to switch to Rust
6 |
7 | # Licene
8 | [Apache License 2.0](https://github.com/madneal/everywhere/blob/master/LICENSE)
9 |
--------------------------------------------------------------------------------
/main.rs:
--------------------------------------------------------------------------------
1 | use eframe::egui;
2 | use std::sync::Arc;
3 | use tokio::sync::Mutex;
4 |
5 | mod app;
6 | mod search;
7 | mod parser;
8 | mod ui;
9 | mod utils;
10 |
11 | use app::DocumentSearchApp;
12 |
13 | #[tokio::main]
14 | async fn main() -> Result<(), Box> {
15 | // 初始化日志
16 | tracing_subscriber::fmt::init();
17 |
18 | // 创建应用
19 | let app = DocumentSearchApp::new().await?;
20 |
21 | // 启动GUI
22 | let options = eframe::NativeOptions {
23 | viewport: egui::ViewportBuilder::default()
24 | .with_inner_size([1200.0, 800.0])
25 | .with_title("文档搜索器"),
26 | ..Default::default()
27 | };
28 |
29 | eframe::run_native(
30 | "Document Search",
31 | options,
32 | Box::new(|_cc| Box::new(app)),
33 | )
34 | .map_err(|e| e.into())
35 | }
--------------------------------------------------------------------------------
/app.rs:
--------------------------------------------------------------------------------
1 | use crate::search::{SearchEngine, DocumentIndexer};
2 | use crate::ui::MainWindow;
3 | use std::sync::Arc;
4 | use tokio::sync::Mutex;
5 | use anyhow::Result;
6 |
7 | pub struct DocumentSearchApp {
8 | main_window: MainWindow,
9 | search_engine: Arc,
10 | indexer: Arc,
11 | }
12 |
13 | impl DocumentSearchApp {
14 | pub async fn new() -> Result {
15 | let search_engine = Arc::new(SearchEngine::new("./index")?);
16 | let indexer = Arc::new(DocumentIndexer::new(search_engine.clone()));
17 | let main_window = MainWindow::new(search_engine.clone());
18 |
19 | Ok(Self {
20 | main_window,
21 | search_engine,
22 | indexer,
23 | })
24 | }
25 | }
26 |
27 | impl eframe::App for DocumentSearchApp {
28 | fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) {
29 | self.main_window.update(ctx);
30 | }
31 | }
--------------------------------------------------------------------------------
/Cargo.toml:
--------------------------------------------------------------------------------
1 | [package]
2 | name = "everywhere"
3 | version = "0.22.0"
4 | authors = ["Paul Masurel "]
5 |
6 | description = """Command line interface for Tantivy, a search engine library."""
7 | documentation = "https://github.com/madneal/everywhere"
8 | homepage = "https://github.com/madneal/everywhere"
9 | repository = "https://github.com/madneal/everywhere"
10 |
11 | readme = "README.md"
12 | keywords = ["search", "information", "retrieval"]
13 | license = "MIT"
14 | edition = "2021"
15 |
16 | [dependencies]
17 | time = "0.3"
18 | iron = "0.6"
19 | staticfile = "0.5"
20 | serde = "1.0"
21 | serde_derive = "1.0"
22 | serde_json = "1.0"
23 | persistent = "0.4"
24 | clap = "4"
25 | ansi_term = "0.12"
26 | urlencoded = "0.6"
27 | mount = "0.4"
28 | log = "0.4"
29 | env_logger = "0.10"
30 | tantivy = { git = "https://github.com/quickwit-oss/tantivy/", rev = "5b1bf1a"}
31 | crossbeam-channel = "0.5.8"
32 |
33 | [[bin]]
34 | name = "tantivy"
35 | path = "src/main.rs"
36 |
37 |
38 | [profile.release]
39 | opt-level = 3
40 | debug = true
41 | debug-assertions = false
--------------------------------------------------------------------------------
/search/indexer.rs:
--------------------------------------------------------------------------------
1 | use crate::parser::{parse_pdf, parse_docx, parse_text};
2 | use crate::search::engine::SearchEngine;
3 | use tantivy::{doc, IndexWriter};
4 | use std::path::{Path, PathBuf};
5 | use walkdir::WalkDir;
6 | use anyhow::Result;
7 | use tokio::fs;
8 |
9 | pub struct DocumentIndexer {
10 | engine: SearchEngine,
11 | }
12 |
13 | impl DocumentIndexer {
14 | pub fn new(engine: SearchEngine) -> Self {
15 | Self { engine }
16 | }
17 |
18 | pub async fn index_directory(&self, dir_path: &Path) -> Result<()> {
19 | let mut writer = self.engine.get_writer()?;
20 |
21 | for entry in WalkDir::new(dir_path).follow_links(true) {
22 | let entry = entry?;
23 | if entry.file_type().is_file() {
24 | if let Some(extension) = entry.path().extension() {
25 | match extension.to_str() {
26 | Some("pdf") => self.index_pdf(&mut writer, entry.path()).await?,
27 | Some("docx") => self.index_docx(&mut writer, entry.path()).await?,
28 | Some("txt") | Some("md") => self.index_text(&mut writer, entry.path()).await?,
29 | _ => continue,
30 | }
31 | }
32 | }
33 | }
34 |
35 | writer.commit()?;
36 | tracing::info!("索引构建完成");
37 | Ok(())
38 | }
39 |
40 | async fn index_pdf(&self, writer: &mut IndexWriter, path: &Path) -> Result<()> {
41 | tracing::info!("索引PDF文件: {:?}", path);
42 | let content = parse_pdf(path).await?;
43 | let title = path.file_stem()
44 | .and_then(|s| s.to_str())
45 | .unwrap_or("Unknown")
46 | .to_string();
47 |
48 | writer.add_document(doc!(
49 | self.engine.title_field => title,
50 | self.engine.content_field => content,
51 | self.engine.path_field => path.to_string_lossy().to_string(),
52 | ))?;
53 |
54 | Ok(())
55 | }
56 |
57 | async fn index_docx(&self, writer: &mut IndexWriter, path: &Path) -> Result<()> {
58 | tracing::info!("索引DOCX文件: {:?}", path);
59 | let content = parse_docx(path).await?;
60 | let title = path.file_stem()
61 | .and_then(|s| s.to_str())
62 | .unwrap_or("Unknown")
63 | .to_string();
64 |
65 | writer.add_document(doc!(
66 | self.engine.title_field => title,
67 | self.engine.content_field => content,
68 | self.engine.path_field => path.to_string_lossy().to_string(),
69 | ))?;
70 |
71 | Ok(())
72 | }
73 |
74 | async fn index_text(&self, writer: &mut IndexWriter, path: &Path) -> Result<()> {
75 | tracing::info!("索引文本文件: {:?}", path);
76 | let content = parse_text(path).await?;
77 | let title = path.file_stem()
78 | .and_then(|s| s.to_str())
79 | .unwrap_or("Unknown")
80 | .to_string();
81 |
82 | writer.add_document(doc!(
83 | self.engine.title_field => title,
84 | self.engine.content_field => content,
85 | self.engine.path_field => path.to_string_lossy().to_string(),
86 | ))?;
87 |
88 | Ok(())
89 | }
90 | }
--------------------------------------------------------------------------------
/main_window.rs:
--------------------------------------------------------------------------------
1 | use crate::search::{SearchEngine, SearchResult};
2 | use std::sync::Arc;
3 | use egui::{Context, TopBottomPanel, CentralPanel, ScrollArea};
4 |
5 | pub struct MainWindow {
6 | search_engine: Arc,
7 | search_query: String,
8 | search_results: Vec,
9 | is_searching: bool,
10 | }
11 |
12 | impl MainWindow {
13 | pub fn new(search_engine: Arc) -> Self {
14 | Self {
15 | search_engine,
16 | search_query: String::new(),
17 | search_results: Vec::new(),
18 | is_searching: false,
19 | }
20 | }
21 |
22 | pub fn update(&mut self, ctx: &Context) {
23 | // 顶部搜索栏
24 | TopBottomPanel::top("search_panel").show(ctx, |ui| {
25 | ui.horizontal(|ui| {
26 | ui.label("搜索: ");
27 | let response = ui.text_edit_singleline(&mut self.search_query);
28 |
29 | if ui.button("🔍 搜索").clicked() ||
30 | (response.lost_focus() && ui.input(|i| i.key_pressed(egui::Key::Enter))) {
31 | self.perform_search();
32 | }
33 |
34 | if ui.button("📁 选择目录索引").clicked() {
35 | if let Some(path) = rfd::FileDialog::new().pick_folder() {
36 | // 异步索引目录
37 | self.index_directory(path);
38 | }
39 | }
40 | });
41 | });
42 |
43 | // 中央搜索结果区域
44 | CentralPanel::default().show(ctx, |ui| {
45 | if self.is_searching {
46 | ui.spinner();
47 | ui.label("搜索中...");
48 | } else {
49 | ScrollArea::vertical().show(ui, |ui| {
50 | for result in &self.search_results {
51 | ui.group(|ui| {
52 | ui.heading(&result.title);
53 | ui.label(format!("路径: {}", result.path.display()));
54 | ui.label(format!("评分: {:.2}", result.score));
55 | ui.separator();
56 | ui.label(&result.content);
57 |
58 | if ui.button("📖 打开文件").clicked() {
59 | self.open_file(&result.path);
60 | }
61 | });
62 | ui.separator();
63 | }
64 | });
65 | }
66 | });
67 | }
68 |
69 | fn perform_search(&mut self) {
70 | if self.search_query.trim().is_empty() {
71 | return;
72 | }
73 |
74 | self.is_searching = true;
75 | match self.search_engine.search(&self.search_query, 20) {
76 | Ok(results) => {
77 | self.search_results = results;
78 | }
79 | Err(e) => {
80 | tracing::error!("搜索失败: {}", e);
81 | }
82 | }
83 | self.is_searching = false;
84 | }
85 |
86 | fn index_directory(&self, path: std::path::PathBuf) {
87 | // 这里需要异步处理,实际实现中可以使用消息传递
88 | tracing::info!("开始索引目录: {:?}", path);
89 | }
90 |
91 | fn open_file(&self, path: &std::path::Path) {
92 | if let Err(e) = opener::open(path) {
93 | tracing::error!("无法打开文件: {}", e);
94 | }
95 | }
96 | }
--------------------------------------------------------------------------------
/search/engine.rs:
--------------------------------------------------------------------------------
1 | use tantivy::*;
2 | use tantivy::query::QueryParser;
3 | use tantivy::collector::TopDocs;
4 | use std::path::PathBuf;
5 | use anyhow::Result;
6 | use serde::{Deserialize, Serialize};
7 |
8 | #[derive(Debug, Clone, Serialize, Deserialize)]
9 | pub struct SearchResult {
10 | pub title: String,
11 | pub content: String,
12 | pub path: PathBuf,
13 | pub score: f32,
14 | }
15 |
16 | pub struct SearchEngine {
17 | index: Index,
18 | reader: IndexReader,
19 | query_parser: QueryParser,
20 | title_field: Field,
21 | content_field: Field,
22 | path_field: Field,
23 | }
24 |
25 | impl SearchEngine {
26 | pub fn new(index_path: &str) -> Result {
27 | // 创建schema
28 | let mut schema_builder = Schema::builder();
29 | let title_field = schema_builder.add_text_field("title", TEXT | STORED);
30 | let content_field = schema_builder.add_text_field("content", TEXT);
31 | let path_field = schema_builder.add_text_field("path", STRING | STORED);
32 | let schema = schema_builder.build();
33 |
34 | // 创建或打开索引
35 | let index_path = std::path::Path::new(index_path);
36 | let index = if index_path.exists() {
37 | Index::open_in_dir(index_path)?
38 | } else {
39 | std::fs::create_dir_all(index_path)?;
40 | Index::create_in_dir(index_path, schema.clone())?
41 | };
42 |
43 | let reader = index.reader()?;
44 | let query_parser = QueryParser::for_index(&index, vec![title_field, content_field]);
45 |
46 | Ok(Self {
47 | index,
48 | reader,
49 | query_parser,
50 | title_field,
51 | content_field,
52 | path_field,
53 | })
54 | }
55 |
56 | pub fn search(&self, query_str: &str, limit: usize) -> Result> {
57 | let searcher = self.reader.searcher();
58 | let query = self.query_parser.parse_query(query_str)?;
59 | let top_docs = searcher.search(&query, &TopDocs::with_limit(limit))?;
60 |
61 | let mut results = Vec::new();
62 | for (_score, doc_address) in top_docs {
63 | let retrieved_doc = searcher.doc(doc_address)?;
64 |
65 | let title = retrieved_doc
66 | .get_first(self.title_field)
67 | .and_then(|f| f.as_text())
68 | .unwrap_or("")
69 | .to_string();
70 |
71 | let path_str = retrieved_doc
72 | .get_first(self.path_field)
73 | .and_then(|f| f.as_text())
74 | .unwrap_or("")
75 | .to_string();
76 |
77 | // 获取匹配的内容片段
78 | let content = self.get_snippet(&searcher, &query, doc_address)?;
79 |
80 | results.push(SearchResult {
81 | title,
82 | content,
83 | path: PathBuf::from(path_str),
84 | score: _score,
85 | });
86 | }
87 |
88 | Ok(results)
89 | }
90 |
91 | fn get_snippet(&self, searcher: &Searcher, query: &dyn Query, doc_address: DocAddress) -> Result {
92 | let snippet_generator = SnippetGenerator::create(searcher, query, self.content_field)?;
93 | let doc = searcher.doc(doc_address)?;
94 | let snippet = snippet_generator.snippet_from_doc(&doc);
95 | Ok(snippet.to_html())
96 | }
97 |
98 | pub fn get_writer(&self) -> Result {
99 | Ok(self.index.writer(50_000_000)?)
100 | }
101 | }
--------------------------------------------------------------------------------
/.idea/workspace.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 | {
37 | "associatedIndex": 4
38 | }
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 | 1538713669351
93 |
94 |
95 | 1538713669351
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 | 1539476588013
112 |
113 |
114 |
115 | 1539476588014
116 |
117 |
118 | 1539477789542
119 |
120 |
121 |
122 | 1539477789542
123 |
124 |
125 | 1539478383935
126 |
127 |
128 |
129 | 1539478383935
130 |
131 |
132 | 1539525774819
133 |
134 |
135 |
136 | 1539525774819
137 |
138 |
139 |
140 | 1750601355492
141 |
142 |
143 |
144 | 1750601355492
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 | tree.getCommonRoot()
167 | JAVA
168 | EXPRESSION
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 | No facets are configured
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 |
211 | 1.8
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 | ui
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 |
233 |
234 |
235 | 1.8
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
245 |
246 |
247 | lib
248 |
249 |
250 |
251 |
252 |
253 |
254 |
255 |
256 |
257 |
258 |
259 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | ## Change Log
2 |
3 | ### v0.1.3 (2017/12/14 20:29 +08:00)
4 | - [bd48a4c](https://github.com/madneal/everywhere/commit/bd48a4c3a49c9897afcf77ebe10a801582a13e16) display all results (@madneal)
5 | - [a41d0b5](https://github.com/madneal/everywhere/commit/a41d0b5f04c0a4367e69b7cef003ea4c0b27b5de) clear data when search test is empty :rocket: (@madneal)
6 | - [fd3451a](https://github.com/madneal/everywhere/commit/fd3451a6d900efe718faf2f53ff1d67326f98c72) update changelog :memo: (@madneal)
7 | - [3c23626](https://github.com/madneal/everywhere/commit/3c23626996fbb192fd93e7f015f9e73985ad238b) convert tan after index finished :lipstick: (@madneal)
8 | - [667ae57](https://github.com/madneal/everywhere/commit/667ae57f536c6421a35282dcea84502544357329) remove STDOUT :fire: (@madneal)
9 | - [1256f07](https://github.com/madneal/everywhere/commit/1256f0784d37be7aca08014e43a0eebf4e6da7e3) reduce System.out :zap: (@madneal)
10 | - [edb0746](https://github.com/madneal/everywhere/commit/edb0746f10ef8af039cfd975ff142d0c33416763) add addAll method (@madneal)
11 | - [a21f1e4](https://github.com/madneal/everywhere/commit/a21f1e4f656bc6cc5bf18d1569f218091b162e5f) modify MyArray (@madneal)
12 | - [b314249](https://github.com/madneal/everywhere/commit/b314249c4314ba60269bb370ac9fbcfee75d3ccb) add MyArray (@madneal)
13 | - [e6aa04c](https://github.com/madneal/everywhere/commit/e6aa04cff5b115b288595b87185975117f51967e) set PrintStream autoflush true (@madneal)
14 | - [446e105](https://github.com/madneal/everywhere/commit/446e10515149814ef3e67d91637e6561f5dddaa4) add GUIUtils :sparkles: (@madneal)
15 | - [c930167](https://github.com/madneal/everywhere/commit/c9301670f3acee75a25a80e53a53400c040c28f1) add about :rocket: (@madneal)
16 | - [96eb0db](https://github.com/madneal/everywhere/commit/96eb0db7d7f54b8157cf6daee25e05349f74b662) make conle texteara move down automatically :rocket: (@madneal)
17 | - [a88cfcc](https://github.com/madneal/everywhere/commit/a88cfccd2b4b7c02b01204281df41fe1db69ec8d) fix Chinese characters print in area encoding problem :bug: (@madneal)
18 | - [e5a55a5](https://github.com/madneal/everywhere/commit/e5a55a53eeb75519d7d83c6ff2b6d274bf674e19) add css for textarea :lipstick: (@madneal)
19 | - [ebd7398](https://github.com/madneal/everywhere/commit/ebd73982150205c6994c58223ba89ece6ad2a40e) add console display :rocket: (@madneal)
20 | - [fc8a992](https://github.com/madneal/everywhere/commit/fc8a992d66b0dd18682261992158074aca3e5999) add CHANGELOG :memo: (@madneal)
21 | - [114fcc6](https://github.com/madneal/everywhere/commit/114fcc6b80dc78d58878958c8055d381c5092547) remove exception try catch :fire: (@madneal)
22 | - [714a0d5](https://github.com/madneal/everywhere/commit/714a0d51b3c531b3b09dc0870a6ba891561c1fe8) add readSheet (@madneal)
23 | - [9a52248](https://github.com/madneal/everywhere/commit/9a52248fb570c637d932110a851546186d1e76cb) fix doc file which is docx essentially by add FileMagic :bug: (@madneal)
24 | - [15f062f](https://github.com/madneal/everywhere/commit/15f062fffa6592bc212a9852b140445453e78209) Merge branch 'master' of https://github.com/madneal/everywhere (@madneal)
25 | - [1662a2e](https://github.com/madneal/everywhere/commit/1662a2e77c17c5b511cc9f9e820509089b874e3c) add lastmodified :rocket: (@madneal)
26 | - [75e33d9](https://github.com/madneal/everywhere/commit/75e33d91291ee885e63e1eae501beb5ebfac9632) Update README.md (@madneal)
27 | - [199be3a](https://github.com/madneal/everywhere/commit/199be3acc6b56fbc03ca188898b86d43cb2fe858) Update README.md (@madneal)
28 | - [a281fa2](https://github.com/madneal/everywhere/commit/a281fa230217008711236aaf9397611908f5bc22) add export ui jar picture (@madneal)
29 | - [eeaa41b](https://github.com/madneal/everywhere/commit/eeaa41b8d2803fa410749ba36d2611991f95c3b0) update download link (@madneal)
30 |
31 | ### v0.1.2 (2017/11/23 19:40 +08:00)
32 | - [6fd7e55](https://github.com/madneal/everywhere/commit/6fd7e55f4200d9c56fb5ca8c479b794899760dc4) add inputDataPath :rocket: (@madneal)
33 | - [ca4c262](https://github.com/madneal/everywhere/commit/ca4c2627226e7e53380ca24728b7ec811603209f) add runIndex by each filepath :rocket: (@madneal)
34 | - [c570560](https://github.com/madneal/everywhere/commit/c570560f07d9678450f3b4c9159c88354894a55c) Merge branch 'master' of https://github.com/madneal/everywhere (@madneal)
35 | - [02166d2](https://github.com/madneal/everywhere/commit/02166d20daffedd9cdbef4a9098436a76d42b6e4) replace Highlighter with UnifiedHighlighter :zap: (@madneal)
36 | - [9bd3641](https://github.com/madneal/everywhere/commit/9bd3641b05502de9c0d0847f59979e1cc1c59970) remove replace \r in readTxt (@madneal)
37 | - [6a22b7c](https://github.com/madneal/everywhere/commit/6a22b7c1ab9b3679460492e3cfad841cf9111668) modify readTxt (@madneal)
38 | - [#2](https://github.com/madneal/everywhere/pull/2) Merge pull request #2 from develio/patch-1 (@develio)
39 | - [c7b4055](https://github.com/madneal/everywhere/commit/c7b405581f1998d968665d0dd21f1880f3d5806d) Typo (@develio)
40 | - [d277417](https://github.com/madneal/everywhere/commit/d2774178ace95134722de31251cdcfb45f7529bc) modify pom.xml (@madneal)
41 | - [a463d55](https://github.com/madneal/everywhere/commit/a463d55b5c1fac83c300f64c571b7be8af2b09eb) Merge branch 'master' of https://github.com/madneal/everywhere (@madneal)
42 | - [5e2a4f2](https://github.com/madneal/everywhere/commit/5e2a4f2ecad3c72ac6e0562f7a4c0595d19e9d08) remove unnecessary files :art: (@madneal)
43 | - [31c3e47](https://github.com/madneal/everywhere/commit/31c3e470c84fa6093669fc615392af4478a0d3dd) add build exe explain (@madneal)
44 | - [ad4c5db](https://github.com/madneal/everywhere/commit/ad4c5dbc25e08092ff0b863ab016f6460007833a) Update README.md (@madneal)
45 |
46 | ### v0.1.1 (2017/11/19 21:14 +08:00)
47 | - [7b257ec](https://github.com/madneal/everywhere/commit/7b257ec8a1c562021c3535b9ceff214df70f585e) Update README.md (@madneal)
48 | - [e629bac](https://github.com/madneal/everywhere/commit/e629bac579b55ef3e6630eff2bd09a9e4f99fc6e) Update README.md (@madneal)
49 | - [848cc8f](https://github.com/madneal/everywhere/commit/848cc8fe9afeb6777e8e3391bad68ac76cfbd116) add gif link (@madneal)
50 | - [71fad57](https://github.com/madneal/everywhere/commit/71fad57561c9d231d0efb284e2081476841d9438) add environment requirements (@madneal)
51 | - [26654b6](https://github.com/madneal/everywhere/commit/26654b6d2321d6ccaa03d19f7b5c48a3e63df337) add advanced setting (@madneal)
52 | - [caa9269](https://github.com/madneal/everywhere/commit/caa92691d4586889c0644ccb977681cb22110bc1) fix in FileUtil (@madneal)
53 | - [dda3826](https://github.com/madneal/everywhere/commit/dda38268bfbe50977cba4b498467fca35239fdff) fix conflicts (@madneal)
54 | - [a95faad](https://github.com/madneal/everywhere/commit/a95faad9fb8dfe6b89e369dc89396003c1b414d2) fix deprecated toURL (@madneal)
55 | - [#1](https://github.com/madneal/everywhere/pull/1) Merge pull request #1 from madneal/dev (@madneal)
56 | - [b579f8e](https://github.com/madneal/everywhere/commit/b579f8ea6745575c928a80ced342ced332f6d96b) only click the current cell (@madneal)
57 | - [7786185](https://github.com/madneal/everywhere/commit/778618590d54c2faec796e32147104156887b222) remove target (@madneal)
58 | - [2f8bb50](https://github.com/madneal/everywhere/commit/2f8bb5045a5fb37d746d045d5438a1f26955e92c) add path query (@madneal)
59 | - [1d3e5ae](https://github.com/madneal/everywhere/commit/1d3e5aeeff9c0a45eb988acc1de2afad10133f1e) modify SearchedResult (@madneal)
60 | - [ce8a413](https://github.com/madneal/everywhere/commit/ce8a4135399af663770d82ba8cfc912b41c71c17) add search type combo (@madneal)
61 | - [3bde66a](https://github.com/madneal/everywhere/commit/3bde66adda787eb18ced3d47ad599e5f8c11f0c1) add links for main techniques (@madneal)
62 | - [a479d07](https://github.com/madneal/everywhere/commit/a479d0754a975a4aeaec99bb3a743236c6dc84fa) Update README.md (@madneal)
63 |
64 | ### v0.1 (2017/11/18 10:27 +08:00)
65 | - [82f43ef](https://github.com/madneal/everywhere/commit/82f43efee857733f87dafd02dfa821caf461510e) Merge branch 'master' of https://github.com/madneal/everywhere (@madneal)
66 | - [5b80ec1](https://github.com/madneal/everywhere/commit/5b80ec1e05910075bfac98081b30ffac79e57c01) modify title in _config.yml (@madneal)
67 | - [10ef63a](https://github.com/madneal/everywhere/commit/10ef63a5ea4fd8540d88fad18b50c05bc07755a2) Update README.md (@madneal)
68 | - [ca8b438](https://github.com/madneal/everywhere/commit/ca8b43821dce2de92b89e790eaffc7b747305d78) Update README.md (@madneal)
69 | - [359a46d](https://github.com/madneal/everywhere/commit/359a46d7238615601ca93a292f1a0ca69f9db3e2) Update README.md (@madneal)
70 | - [457fb73](https://github.com/madneal/everywhere/commit/457fb73a50a76216f47fb697a4c4290ca85fdb0e) add usage (@madneal)
71 | - [c42f52f](https://github.com/madneal/everywhere/commit/c42f52ffe81c6c2a9283eec138a7bc85e3d7e828) add emoji plugin (@madneal)
72 | - [76b3a36](https://github.com/madneal/everywhere/commit/76b3a36f81da7b8ffeddaabcf2e620e4296ebbe8) Merge branch 'master' of https://github.com/madneal/everywhere (@madneal)
73 | - [0b51e1f](https://github.com/madneal/everywhere/commit/0b51e1fad60458d058bc7a7bc098df38316ba4f6) seprate IndexWriter and IndexReader :sparkles: (@madneal)
74 | - [cd05ce8](https://github.com/madneal/everywhere/commit/cd05ce895f0ebcbe97c50d09dab0b7aa08980ae7) Set theme jekyll-theme-minimal (@madneal)
75 | - [ce073db](https://github.com/madneal/everywhere/commit/ce073dbfc7e015cd2c607d48097e5401ec344635) add index indication label :lipstick: (@madneal)
76 | - [300a2c1](https://github.com/madneal/everywhere/commit/300a2c11ffd575df7dc0d5a8713f79311dee6bfa) remove unnecessary code (@madneal)
77 | - [d4228c6](https://github.com/madneal/everywhere/commit/d4228c604b24047f05a623f17711abb2385ee6fc) remove unsignificant elements (@madneal)
78 | - [1413286](https://github.com/madneal/everywhere/commit/14132861f668441c8aaecd1e2262da73d01f5e7e) add log :rocket: (@madneal)
79 | - [4c8b545](https://github.com/madneal/everywhere/commit/4c8b5453a086f8b56d38f9d7e1beb4f5c25f4142) Merge branch 'master' of https://github.com/madneal/everywhere (@madneal)
80 | - [00edc88](https://github.com/madneal/everywhere/commit/00edc882f7aa395117f29248fe1fa484d8fd6b04) move index button (@madneal)
81 | - [50c528b](https://github.com/madneal/everywhere/commit/50c528bc1f9d5150c3f44ffcf058b9fd73382959) Set theme jekyll-theme-slate (@madneal)
82 | - [3d3691f](https://github.com/madneal/everywhere/commit/3d3691f2a77d91d694399cf354d14e7dbd733d0f) Update README.md (@madneal)
83 | - [08008c4](https://github.com/madneal/everywhere/commit/08008c44c068e5f904c193f74e744a0ba88da1e3) Update README.md (@madneal)
84 | - [da0acfa](https://github.com/madneal/everywhere/commit/da0acfac0dba575f35d66656e5fb8c7928be9e72) add main techniques (@madneal)
85 | - [1a7fbc0](https://github.com/madneal/everywhere/commit/1a7fbc0648479d37fbfe239a1c7c70220bc8fb91) add open document :rocket: (@madneal)
86 | - [ac1633c](https://github.com/madneal/everywhere/commit/ac1633c9271deec772d8db8e40ed32de22cc2ee0) first valid for cell click (@madneal)
87 | - [865000c](https://github.com/madneal/everywhere/commit/865000c7d7d0cde78dcdb9373bbf0de9a6bb2c01) add file empty (@madneal)
88 | - [b8d5495](https://github.com/madneal/everywhere/commit/b8d5495957875bbbbfb617e773c2e3848a77c644) remove jars :fire: (@madneal)
89 | - [72655cb](https://github.com/madneal/everywhere/commit/72655cbea6f6affe0ee562851039c0e65da4e1cb) modify backspace :bug: (@madneal)
90 | - [da11b70](https://github.com/madneal/everywhere/commit/da11b70b3d1f6d411c1c13389c62ff03c3ca61f0) add open file function (@madneal)
91 | - [65ea50f](https://github.com/madneal/everywhere/commit/65ea50fcd57b81486bdf0ebd6a50dc29fc761311) add hyperlink (@madneal)
92 | - [b8dd7d4](https://github.com/madneal/everywhere/commit/b8dd7d48f408621b60de9fd066c2d0437a0b86cc) remove hello world :fire: (@madneal)
93 | - [78b03ef](https://github.com/madneal/everywhere/commit/78b03eff2df06d3b3459574d70552a1501632fad) remove comment :fire: (@madneal)
94 | - [97bc03b](https://github.com/madneal/everywhere/commit/97bc03b5313742ec634cdeb2828ce077364ef484) modify .gitignore (@madneal)
95 | - [52b0997](https://github.com/madneal/everywhere/commit/52b0997d26c1dc3cc045a1f9cd5ef3346c458c2c) remove out and target :fire: (@madneal)
96 | - [d92044e](https://github.com/madneal/everywhere/commit/d92044edac99527eb464cd1abf1954c8154cc699) modify .gitignoire (@madneal)
97 | - [32fbc56](https://github.com/madneal/everywhere/commit/32fbc5687340a3168be9047d239c6f2317dbfff6) remove index :fire: (@madneal)
98 | - [e899ef3](https://github.com/madneal/everywhere/commit/e899ef3851c4b97b0788cec45de586ddd0b89b81) add package build“ (@madneal)
99 | - [6d55553](https://github.com/madneal/everywhere/commit/6d55553f717be4f037c44d74c8b565d01969b688) rename .gitignore (@madneal)
100 | - [5d443ed](https://github.com/madneal/everywhere/commit/5d443eda3ee4618eb054a4964e774643810d62a5) remove .idea (@madneal)
101 | - [a946d63](https://github.com/madneal/everywhere/commit/a946d630dceb1592ea91a21d0ad880d2d21a8264) remove .idea (@madneal)
102 | - [e719965](https://github.com/madneal/everywhere/commit/e7199651f98e6f491c0455e94b930dfbbdb19f7f) finish the tableview :lipstick: (@madneal)
103 | - [3881d54](https://github.com/madneal/everywhere/commit/3881d543446fdd9f5516dcbc1e7610ee99c7283d) remove .idea :fire: (@madneal)
104 | - [daee925](https://github.com/madneal/everywhere/commit/daee925e67aeb83c21b88742a1965b61fc04530b) remove .idea :fire: (@madneal)
105 | - [de1f3eb](https://github.com/madneal/everywhere/commit/de1f3eb09f5b300b2e36972aae97007734a06347) modify search field PATH (@madneal)
106 | - [ded4021](https://github.com/madneal/everywhere/commit/ded402111c07a4b388ef060b001d39b2b94eacaf) still not finished the search :bug: (@madneal)
107 | - [d8cc26d](https://github.com/madneal/everywhere/commit/d8cc26d5d8f489d4e7cea5db1e3a939701f30578) modify cannot input Chinese in TextField :bug: (@madneal)
108 | - [e9e12d6](https://github.com/madneal/everywhere/commit/e9e12d6081d97ddad431f0452a48bb85a5838123) modify ignore (@madneal)
109 | - [1b7e558](https://github.com/madneal/everywhere/commit/1b7e558d7df6cc479b5437e5d0c708f54d651b7f) modify search (@madneal)
110 | - [1c29d42](https://github.com/madneal/everywhere/commit/1c29d4226128a88083695de08e47389716b3a0f7) add SearchedResult (@madneal)
111 | - [fed82dc](https://github.com/madneal/everywhere/commit/fed82dc2423ff9e93fd383f01b0b010c42c3690d) modify .gitignore (@madneal)
112 | - [5f9fc25](https://github.com/madneal/everywhere/commit/5f9fc251b4dd530e8a6240cddcd70563158fcf65) modify SearchUtil (@madneal)
113 | - [ac43019](https://github.com/madneal/everywhere/commit/ac430198d4067963d5be77ad9d5d7e24a9f15547) Merge branch 'master' of https://github.com/madneal/everywhere (@madneal)
114 | - [dbb976e](https://github.com/madneal/everywhere/commit/dbb976ef67071b2e3b6f6e614c97f5efd94e1a47) remove target :fire: (@madneal)
115 | - [78d306f](https://github.com/madneal/everywhere/commit/78d306fe1acb0219a44371dc61d6af2e313c0536) Update .gitnignore (@madneal)
116 | - [1810070](https://github.com/madneal/everywhere/commit/1810070e475e32ecf03cdb2e9d14f8628a52b94d) Merge branch 'master' of https://github.com/madneal/everywhere (@madneal)
117 | - [3c35d74](https://github.com/madneal/everywhere/commit/3c35d74b11018395f567e8735348076df8fc70c9) remove out :fire: (@madneal)
118 | - [f3f00ba](https://github.com/madneal/everywhere/commit/f3f00baa7b4b43232b72b106c66322ca4928ea8d) Update .gitnignore (@madneal)
119 | - [32c36ec](https://github.com/madneal/everywhere/commit/32c36eca1c77bde50199f2fd8cac330e3652fc7c) add SearchResult :sparkles: (@madneal)
120 | - [1f00ee1](https://github.com/madneal/everywhere/commit/1f00ee19f16defff3195c8f3db8bbe2a1cb9be24) modfiy searchType (@madneal)
121 | - [279a509](https://github.com/madneal/everywhere/commit/279a509201209380808aef5ed02f1977ca689320) add inputchange (@madneal)
122 | - [05d9c50](https://github.com/madneal/everywhere/commit/05d9c50211d785252824239f2541ad09c3525dbd) add Controller (@madneal)
123 | - [1f5f573](https://github.com/madneal/everywhere/commit/1f5f57344a2a80077c0de1eb5f97542e2e9af237) add config :wrench: (@madneal)
124 | - [e7e6169](https://github.com/madneal/everywhere/commit/e7e61699871d0f424dd971360d032baccc3aa8a2) remove out folder :fire: (@madneal)
125 | - [273b36f](https://github.com/madneal/everywhere/commit/273b36f0d3272ce4d0cdcbb67d8e1030cc062aaf) Create .gitnignore (@madneal)
126 | - [7c749a5](https://github.com/madneal/everywhere/commit/7c749a5143d382f892bf4258282a1210b98b38ad) add windows :lipstick: (@madneal)
127 | - [2f9d35b](https://github.com/madneal/everywhere/commit/2f9d35b112db502c96c95b0574b73f93a43ea6a0) modify sample.fxml (@madneal)
128 | - [a63df60](https://github.com/madneal/everywhere/commit/a63df6025de678d12dfb342f2026591db437f746) add ui :rocket: (@madneal)
129 | - [e363c30](https://github.com/madneal/everywhere/commit/e363c30d92ab1c1fe51fb0a8a294c5ad4731d312) almost finish search :rocket: (@madneal)
130 | - [a7cc6fd](https://github.com/madneal/everywhere/commit/a7cc6fd89619dae14dfeb6c30800ca6d85c4e89c) finish FileUtil (@madneal)
131 | - [1b2843a](https://github.com/madneal/everywhere/commit/1b2843ae24b62785e681f30d4120655a8d4eac61) add dependecies :arrow_up: (@madneal)
132 | - [4c85ad4](https://github.com/madneal/everywhere/commit/4c85ad4946feab115f2352b14b32d0deb5af7f65) add dependency :arrow_up: (@madneal)
133 | - [1fa05eb](https://github.com/madneal/everywhere/commit/1fa05eb4e7e1aab27b0d9543eb746798740f66bb) add modules :arrow_up: (@madneal)
134 | - [d102017](https://github.com/madneal/everywhere/commit/d10201763de9819453d178a6b11dcddd94082762) Merge branch 'master' of https://github.com/madneal/everywhere (@madneal)
135 | - [f3283e5](https://github.com/madneal/everywhere/commit/f3283e56ba01ebb5e5f2f0b2e0d4000d307d9ab3) initial the project :tada: (@madneal)
136 | - [f1848cd](https://github.com/madneal/everywhere/commit/f1848cd610721b2ae6de9af619be97d91f848af3) Initial commit (@madneal)
--------------------------------------------------------------------------------