Spotlight ちゃんと使いたい

# Spotlight

ファイル探すのを Spotlight に依存してるけど、見つからなかったりすることがたまによくあるのでちゃんと知識をえる

# まとめ

- mdls をすると index されて(いる|いない)ことは判定できる
- `log show` `log stream` などのログでは個別ファイルのインデックス状況を追うようなことはできない
  - mdworker のプロセスを activity monitor とかで見ればどのファイルを開いているかなどでファイルを読んでいる様子は観察できる
- `mdimport` で file を個別に index に入れることができ `mdimport -i` でディレクトリ内のファイルを index に入れることができる。
　 - よく検索するディレクトリを再検索するようにスクリプトにしておくといい。

# 過程

メモメモ

## volume path って何

Spotlight の検索対象の一番大きな括りっぽい

```
mdutil -a -s
```

で確認できるっぽい。

/ とか /Volume/SSD001 とかそういうストレージデバイスのマウントポイントのことっぽい。

## コマンドの構成？

```
mdutil -a -s
```

a は全部にっていう意味で、 s はステータスを見せてっていう意味で、 -a を `-V /` とかして対象を変えることができる。 target 系のオプションと、 command 系のオプションに分かれると考えておけばいいかも。 

でも

```
sudo mdutil -P /
```

のように target と command がセットになったようなコマンドもあるようだ。大文字のコマンドは volume 指定必須？のように見える。そういうコンセプトがあるかもしれない。

## ログ見たい

```
log show --debug --info --predicate 'processImagePath ENDSWITH "/mds" OR processImagePath ENDSWITH "/mds_stores"' --start '2023-11-19 23:00:00'
```

とかやればいい。

predicate は NSPredicate というよく mac に組み込まれている情報をフィルタリングするための言語。 `processImagePath CONTAINS[c] "mds"` のように `[c]` とかやって演算子を拡張するのがキモい。 

[NSPredicate の文法ドキュメント見つけた](https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Predicates/Articles/pBNF.html#//apple_ref/doc/uid/TP40001796-CJBDBHCB)

start とかで直近の時間を指定するといい

debug と info はより細かいろぐを見たいときに便利 debug だと出過ぎたら消せばいい

```
log stream --debug --info --predicate 'processImagePath ENDSWITH "/mds" OR processImagePath ENDSWITH "/mds_stores"'
```

のように show を stream にすれば tail -f みたいに sticky にログを見られる

どんな情報で絞れるかは

```
% log help predicates
valid predicate fields:
    activityIdentifier                    (integer)
    bootUUID                              (uuid)
    category                              (string)
    composedMessage                       (string)
    continuousNanosecondsSinceBoot        (integer)
    creatorActivityIdentifier             (integer)
    creatorProcessUniqueIdentifier        (integer)
    date                                  (date)
    formatString                          (string)
    logType                               (log type)
    machContinuousTimestamp               (integer)
    parentActivityIdentifier              (integer)
    process                               (string)
    processIdentifier                     (integer)
    processImagePath                      (string)
    processImageUUID                      (uuid)
    sender                                (string)
    senderImageOffset                     (integer)
    senderImagePath                       (string)
    senderImageUUID                       (uuid)
    signpostIdentifier                    (integer)
    signpostScope                         (signpost scope)
    signpostType                          (signpost type)
    size                                  (integer)
    subsystem                             (string)
    threadIdentifier                      (integer)
    timeToLive                            (integer)
    traceIdentifier                       (integer)
    transitionActivityIdentifier          (integer)
    type                                  (event type)
```

このように見られる。

また

```
log stream --style json
```

みたいにすると json で見られるので predicate を書くと時にも便利

## log を追う

一旦以下のコマンドで、 Path を保存している流れが見られる。パス名までは表示されない。 reverseStore というもの（多分、検索用の転置インデックスを保存してる DB）に、対して path を precache して commit して flush して、などの操作がわかる。

```
log stream --debug --info --predicate 'subsystem == "com.apple.spotlightindex" AND category == "Path"'
```

うーん。動いているということしかわからん。

reverseStore に関連する名前のファイルが Volume 直下の .Spotlight-V100 ディレクトリにも見られるので、そこに転置インデックスがあるんだろう。

## 他に

`md` のつくコマンドを一通り man で読んでみた `mdls` で null が出る場合は index されていない。 `mdimport` で一ファイルだけとか、一ディレクトリだけとかインデックスできそう

```
mdimport /dir/filename
```

で、検索されなかったファイルが検索されるようになったことを確認できた。

```
mdimport -i /dir
```

で、ディレクトリ内の検索されなかったファイルが検索されるようになったことを確認できた。